ARM嵌入式系統(tǒng)上OpenCL測(cè)試
1). 簡(jiǎn)介
相比曾經(jīng),如今科技設(shè)備對(duì)處理性能和速度要求越來(lái)越高。為了應(yīng)對(duì)這種技術(shù)需求,許多公司發(fā)明了不少方法來(lái)獲得更好的處理性能。例如蘋果公司,發(fā)明了 Open Computing Language (OpenCL)。2008年6月,蘋果公司向Khronos Group 提交了 OpenCL 工作建議。歷經(jīng)五個(gè)月的研發(fā),OpenCL 1.0 于 2008 年 11 月發(fā)布。
OpenCL 是為個(gè)人電腦、服務(wù)器、移動(dòng)設(shè)備以及嵌入式設(shè)備的多核系統(tǒng)提供并行編程開發(fā)的底層 API。OpenCL 的編程語(yǔ)言類似于 C 語(yǔ)言。其可以用于包含 CPU、GPU 以及來(lái)自主流制造商如 NXP®、NVIDIA®、Intel®、AMD、IBM 等的處理器的異構(gòu)平臺(tái)。OpenCL 旨在提高應(yīng)用軟件如游戲、娛樂(lè)以及科研和醫(yī)療軟件的運(yùn)行速度和響應(yīng)。
在本博文中,我們使用Toradex公司基于NXP iMX6QSoC的計(jì)算機(jī)模塊產(chǎn)品ApalisiMX6Q 來(lái)測(cè)試 OpenCL,對(duì)比兩個(gè)應(yīng)用 - 一個(gè)運(yùn)行在 GPU 上,另一個(gè)則在 CPU。最后我們將分享本次測(cè)試的結(jié)果。
2). 測(cè)試硬件平臺(tái)
Toradex 的 Apalis iMX6Q 計(jì)算機(jī)模塊采用 NXP 的 iMX6 四核處理器,其提供的處理性能特別適合于多媒體應(yīng)用。該處理器具有 4 個(gè) ARM® Cortex®-A9 核,最高主頻為 800MHz。除了處理器,Apalis 系統(tǒng)模塊還具有高達(dá) 2GB DDR3 RAM(64bit)和 4GB eMMC Flash。
除了具備出色的圖形和多媒體處理能力,該處理器還具有 Vivante GC2000 3D GPU,其能夠支持 OpenCL EP (Embedded Profile)。因此,我們能充分夠利用 i.MX6QGPU 處理能力。
3). Toradex Embedded Linux 鏡像中添加 OpenCL
我們假設(shè)你已經(jīng)具有能夠編譯 Apalis iMX6 鏡像的 OpenEmbedded 編譯環(huán)境。你可以參考Toradex開發(fā)者中心OpenEmbedded(core) 文章。
為編譯支持 OpenCL 以及相關(guān)庫(kù)文件的嵌入式 Linux 鏡像,需要采取以下步驟:
4). GPU 和CPU 代碼
我們使用數(shù)列求和應(yīng)用作為基本的演示例程。第一部分代碼運(yùn)行在 GPU 上,第二部分則在 CPU 上。應(yīng)用執(zhí)行完畢后打印其所消耗的時(shí)間。使用 OpenCL 所需的頭文件是 cl.h,位于文件系統(tǒng)的 /usr/include/CL 目錄。鏈接程序所需的庫(kù)文件是 libGAL.so 和 libOpenCL.so,位于 /usr/lib 目錄。
為了計(jì)算消耗的時(shí)間,我們創(chuàng)建帶分析功能的隊(duì)列,在結(jié)束的時(shí)候獲取分析的結(jié)果。
OpenCL 代碼見如下GitHub鏈接:
https://github.com/giobauermeister/OpenCL-test-apps/tree/master/cl_sample_timer
CPU 代碼是簡(jiǎn)單的 C 程序,和上面一樣計(jì)算同樣的隊(duì)列求和。為了計(jì)算消耗的時(shí)間,我們使用 time.h中的庫(kù)。代碼見如下鏈接:
https://github.com/giobauermeister/OpenCL-test-apps/tree/master/proc_sample
5). 交叉編譯應(yīng)用
同一個(gè) Makefile 可以用于交叉編譯 GPU 和 CPU 應(yīng)用,如以下面鏈接Makefile為例,不過(guò)你需要注意下面的三個(gè)變量。根據(jù)你的系統(tǒng)做相應(yīng)的調(diào)整:
https://github.com/giobauermeister/OpenCL-test-apps/blob/master/proc_sample/Makefile
a). ROOTFS_DIR -> Apalis iMX6 文件系統(tǒng)路徑
b). APPNAME -> 應(yīng)用的名字
c). TOOLCHAIN -> 交叉編譯工具的路徑
在應(yīng)用所在的目錄中保持 Makefile 文件,然后運(yùn)行 make。最后將編譯生成的文件復(fù)制到 Apalis iMX6 開發(fā)板上。
6). 在執(zhí)行兩個(gè)應(yīng)用程序后,我們得到以下結(jié)果:
--------------------------------
### Processor time
Execution time in miliseconds = 778.999 ms
Execution time in seconds = 0.779 s
### GPU time
Execution time in milliseconds = 12.324 ms
Execution time in seconds = 0.012 s
--------------------------------
根據(jù)以上結(jié)果,我們可以很清楚地看到在 Apalis iMX6Q GPU 上使用 OpenCL 能夠加速隊(duì)列求和運(yùn)算。
7). 總結(jié)
用戶想要使用 Apalis iMX6Q GPU ,除了其他的方法,還可以使用 OpenCL 提高計(jì)算性能。正如本博文所描述,借助 OpenCL,可以在不同設(shè)備從圖形顯卡到超級(jí)計(jì)算機(jī)以及嵌入式設(shè)備,運(yùn)行代碼。用戶還可以進(jìn)一步結(jié)合,例如在 OpenCV 中使用 OpenCL 提高計(jì)算機(jī)視覺(jué)的性能。這個(gè)演示可以作為開發(fā)無(wú)圖形界面應(yīng)用的例程。
參考
https://www.khronos.org/opencl/
https://en.wikipedia.org/wiki/OpenCL
http://www.drdobbs.com/parallel/a-gentle-introduction-to-opencl/231002854
https://community.freescale.com/docs/DOC-93984
https://community.freescale.com/docs/DOC-100694
http://developer.toradex.com/products/apalis-imx6
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetEventProfilingInfo.html
http://parallelis.com/how-to-measure-opencl-kernel-execution-time/
https://software.intel.com/en-us/articles/intel-sdk-for-opencl-applications-performance-debugging-intro
本文最初以葡萄牙語(yǔ)在Embarcados.com 上發(fā)表,請(qǐng)參考這里。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測(cè)試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試