關于OpenCL
OpenCL是Open Computing Language的簡寫,目前已經形成了標準,是跨平臺的,通常由圖形處理器(GPU)提供硬件層面支持。OpenCL的設計目的,主要是為了將GPU強大的浮點和并行運算能力,以及能與CPU協作的能力,從軟件層面開放給用戶使用。用法跟OpenGL類似。
通常情況下,對同一組數據進行并行運算,使用OpenCL比執行普通CPU端程序,要快很多倍。
站在應用軟件的角度,OpenCL簡單來說,就是一組API函數名稱,操作系統通常會提供具體實現庫,以及運行于GPU之上的程序(OpenCL中稱為kernel),文件后綴通常為.cl,基于OpenCL語法編寫的程序,由CPU加載編譯后,傳輸到OpenCL設備的內存供GPU執行。各個圖形處理器廠商,針對自己的具體芯片,在GPU驅動程序中適配這些API,用戶就可以基于這些標準的API進行相關的OpenCL應用程序開發。
需要指出的是:跟OpenGL的shader程序類似,OpenCL的kernel程序也是具體GPU芯片相關的,不能跨GPU型號使用。同一段代碼,可能換了GPU型號之后就不能編譯通過,第一個GPU使用的二進制kernel程序,不應該直接加載到第二個不同型號GPU上面使用。
OpenCL應用運行框圖
OpenCL設備內部,通常會有大量的并行計算單元(上圖中的CU),每個計算單元內部又包含有若干個處理單元(圖中的PE),PE可以同時并行地執行相同OpenCL代碼,從而實現高性能并行運算,具體CU以及PE數量已經運算性能,跟具體GPU廠商的具體GPU型號有關。
OpenCL代碼被CPU加載到設備內存之后,CPU通過相應的OpenCL API來啟動OpenCL設備的運行,同時還能查詢執行狀態,實現CPU-GPU之間的同步,設備關閉等操作。
RZ/G2L上的OpenCL支持
RZ/G2L微處理器配備Cortex-A55(1.2 GHz)CPU、16 位 DDR3L/DDR4接口、帶Arm Mali-G31的3D圖形加速引擎以及視頻編解碼器(H.264),如下圖紅色框所示。此外,這款微處理器還配備有大量接口,如攝像頭輸入、顯示輸出、USB 2.0和千兆以太網,因此特別適用于入門級工業人機界面(HMI)和具有視頻功能的嵌入式設備等應用。
此GPU支持2D/3D圖形,以及通用GPU運算(GPGPU)。具體支持如下標準API:
● OpenCL 2.0 Full Profile
●OpenGL ES 1.1 2.0 3.0 3.1 and 3.2
RZ/G2L上的OpenCL Library及其使用
RZ/G2L的VLP開發環境里面有提供Linux版OpenCL Library(需要從官網另外下載)以及對應頭文件。
RZ/G2L的OpenCL庫支持3種運行模式:
● CPU Mode:并行運算在CPU端完成,應用程序仍然需要調用OpenCL庫API,OpenCL庫內部會基于ARMv8 NEON SIMD指令集做針對性優化。
● GPU Mode:并行運行在GPU端完成,驅動程序會充分利用OpenCL設備的PE單元,提示并行性和運算效率。
● BOTH Mode:上面兩種模式的結合。
通常情況下,BOTH Mode能提供最佳性能,典型做法是將待處理的并行數據,平均分成連續的兩部分,CPU和GPU各自處理一半的數據(BOTH模式)。結合CPU模式,是因為CPU端有高主頻,大Cache,高DDR帶寬等優勢。由于GPU端PE的特殊性,對待處理的數據,要求是,所有輸入數據運算方法相同,沒有依賴性,比如:兩組輸入數組A[1024]和B[1024]分別存放有1024字節的float類型數據,將A和B同序號的數據分別做乘法,結果保存于浮點數組C[1024],即:
C[0] = A[0] * B[0];
C[1] = A[1] * B[1];
… …
因為所有PE只能并行執行相同的kernel程序。
OpenCL庫的使用,主要分為如下步驟:
●獲取平臺信息
●獲取設備信息
●創建上下文
●創建命令隊列
●創建和編譯kernel程序
●創建kernel對象
●創建內存對象
●設置kernel參數
●執行kernel程序
●同步操作
●獲取處理結果
●清理資源
部分OpenCL API介紹
OpenCL API通常以 cl_ 開頭,很容易識別。
獲取平臺信息
cl_int clGetPlatformIDs(cl_uint num_entries,
cl_platform_id *platforms,
cl_uint *num_platforms);
這個函數是OpenCL應用程序必須調用的第一個API,用來獲取可使用的Platform ID數組,當平臺數未知時,第一次調用clGetPlatformIDs函數獲取平臺數量,第二次調用clGetPlatformIDs函數獲取平臺對象,供后續API使用。
cl_int clGetPlatformInfo(cl_platform_id platform,
cl_platform_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);
用于獲取OpenCL的Profile信息、版本、平臺制造商、支持的擴展等。
獲取設備信息
cl_int clGetDeviceIDs(cl_platform_id_platform,
cl_device_type device_type,
cl_uint num_entries,
cl_device_id *devices,
cl_uint *num_devices);
這個API用來獲取平臺可使用的設備對象數組。可用于獲取CPU/GPU/專用加速器等OpenCL設備數量等。
cl_int clGetDeviceInfo(cl_device_id device,
cl_device_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret);
用于獲取選定設備相關信息,如并行計算單元最大數量、設備端全局內存大小等信息。
由于OpenCL API涉及的內容比較多,另一方面,OpenCL相關標準已經很成熟,網上有很多的示例資源可供參考,瑞薩也可以提供MPU上的OpenCL例子給到客戶,剩下的OpenCL應用程序步驟相關API,就不進一步介紹了。
審核編輯:劉清
-
微處理器
+關注
關注
11文章
2274瀏覽量
82778 -
圖形處理器
+關注
關注
0文章
201瀏覽量
25669 -
視頻編解碼器
+關注
關注
0文章
18瀏覽量
11624 -
OpenCL
+關注
關注
2文章
48瀏覽量
33385 -
GPU芯片
+關注
關注
1文章
303瀏覽量
5898
原文標題:RZ/G2L OpenCL使用介紹
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論