2015年2月5日 星期四

在 Linux Mint 17.1 上面安裝 Altera OpenCL 14.1 (一)

因為最近實驗室要買友晶的 DE5 跑 OpenCL
所以就嘗試了一下如何安裝
因為板子還沒來,所以(一)就是軟體模擬的部份(使用官網的 14.1 範例)
希望會有 (二)跟 (三)之類的


因為自己的電腦是 Linux Mint 17.1
他的檔案應該是為了 CentOS 提供的
可是我實在是不想裝套件庫的 vim 還留在 7.2 的作業系統
而且自己是用 zsh
加上這個版本 bash completion 似乎有點問題?
所以會講解這個設定下需要的修改

以下這次的大綱

  • 安裝 driver
  • 環境變數設定
  • 編譯主機端程式 (host code)
  • 執行模擬
  • zsh 的 script

安裝 driver

理論上來說,用 root 執行這個指令應該就可以安裝 driver 了aocl install

但是因為環境不同,所以會出一些問題

不同 Linux 版本下路徑設定的問題

因為 CentOS 放資料的路徑不同,所以要這樣作
好像要先安裝 debian 下 kernel-devel 的對應套件?
但是我以前裝過了,所以也不知道叫啥
請注意核心版本號

cd /usr/src
mkdir kernels && cd kernels
ln -s ../linux-headers-3.13.0-37-generic headers-3.13.0-37-generic

好像安裝步驟會把部份檔案放到這個資料夾,所以加上這行避免錯誤訊息
事後移除,甚至無視這個錯誤訊息好像也沒關係
mkdir -p /etc/sysconfig/modules/

編譯器以及核心版本問題

因為核心API改變,所以有一些地方會編譯錯誤

不需要這兩個 macro 了
aclpci.c
#define __devinit
#define __devexit

改名了
aclpci_cmd.c
pci_dev->aer_firmware_first ⇒ pci_dev->__aer_firmware_first

腦袋有洞的 code?

或許以前真的會回傳值吧

aclpci_cmd.c
result = pci_restore_state(aclpci->pci_dev);
⇒ pci_restore_state(aclpci->pci_dev);

驗證安裝

應該有東西輸出
lsmod | grep aclpci_drv

裝上或是卸載驅動程式(*.ko 的位置是固定的嗎?)
insmod /lib/modules/3.13.0-37-generic/misc/aclpci_drv.ko
rmmod aclpci_drv

環境變數設定

大約是這樣,自己改就好了
不過預設沒有 DE5 的 board package,自己去 Terasic 抓
要注意的是,「可能」要把 Altera OpenCL 跟 Quartus 裝在一個目錄下
License 自己處理

QUARTUS_ROOT=/opt/altera/14.1
AOCL_ROOT=/opt/altera/14.1/hld
export PATH=${PATH}:${QUARTUS_ROOT}/bin:${AOCL_ROOT}/bin
export QUARTUS_ROOTDIR=$QUARTUS_ROOT
export QUARTUS_64BIT=1
export ALTERAOCLSDKROOT=$AOCL_ROOT
export AOCL_BOARD_PACKAGE_ROOT=$AOCL_ROOT/board/terasic/de5net
source $AOCL_ROOT/init_opencl.sh

編譯主機端程式 (host code)

這時候把範例的 Makefile 直接拿來編譯應該就會編譯成功了。
make VERBOST=1 DEBUG=1
Makefile 裡面用到了 aocl(有類似 pkg-config 的功能)。

執行模擬

官方文件上面寫這樣就能產生模擬需要的 aocx 檔案
aoc -march=emulator vector_add.cl

把 aocx 複製到執行檔同一個目錄下
輸入這樣就能執行了
CL_CONTEXT_EMULATOR_DEVICE_ALTERA=1 ./vector_add

不意外地,上面的設定在電腦上不能動
Initializing OpenCL
Emulator runtime library missing in host program.
Please relink host with -lacl_emulator_kernel_rt

可是剛剛編譯參數明明有這個啊?
原來某個版本之後的 linker 不會把沒用到的 *.so 檔加入執行檔內
所以要在 Makefile 改這行
AOCL_LINK_CONFIG := $(shell aocl link-config)
 AOCL_LINK_CONFIG := -Wl,--no-as-needed $(shell aocl link-config)

可以用 ldd 檢查這件事
之後執行應該就會過了
Initializing OpenCL
Platform: Altera SDK for OpenCL
Using 1 device(s)
  EmulatorDevice : Emulated Device
Using AOCX: vector_add.aocx
Launching for device 0 (1000000 elements)

Time: 8985.262 ms
Kernel time (device 0): 8982.419 ms

Verification: PASS

zsh 的 script

init_opencl.sh 裡面有一些語法不相容 zsh,所以需要的話要改一下
前幾行有用 BASH_SOURCE 去決定這個檔案是不是被 source

zsh 的字串相等是用 = 而不是 ==,要改

結論

這邊講解了怎麼讓 DE5 OpenCL DE5 的範例 (14.1) 在 Linux Mint 17.1 動起來
使用了 Altera OpenCL 的模擬模式

如果可以的話也想研究範例程式怎麼動的
另外,希望等板子來了以後會有後續

沒有留言:

張貼留言