OPENCL程式設計學習
一、基本介紹
OPENCL(open computing language) 是一個工業級開放的異構程式設計标準,它同時提供了一個并行程式設計的架構和封裝庫,可以讓程式設計人員編寫高性能并且可移高的代碼。
二、基礎内容
下面将從四個方面對opencl進行闡述,分别是基本架構、記憶體組織、執行模型、程式設計模型:
2.1 基本架構
opencl基本架構如下圖:
關鍵字 | 釋義 |
---|---|
Compute Device | 計算裝置(GPU/ANIC/FPGA) |
Compute Unit | 計算單元(類似gpu sm) |
Process element | 計算單元(l類似gpu wrap) 裝置執行的基本單元 |
HOST | 主機裝置 |
2.2 執行模型
opencl執行模型圖如下:
關鍵字 | 釋義 |
---|---|
kernel | 在device端執行的程式 |
work-item | 在device端一個執行的kernel集合(類似cuda thread) |
work-group | 管理work-items一個集合(類似cuda block) |
三、記憶體組織
記憶體邏輯分布圖如下:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-kaGsmIwM-1617343931193)(D:\work\文檔\openclMemory.png)]
關鍵字 | 釋義 |
---|---|
global memory | 全局記憶體所有work-group中資料都是可見的 |
constant memory | 全局記憶體,但是在kernel執行的時候被建立為constant屬性 |
local memory | 該記憶體隻在work-group中可見,看裝置實作有可能是global memory或者片内記憶體 |
private memory | 該記憶體隻在work-item中可見,應該是register類似記憶體 |
四、程式設計模型
opencl支援的程式設計模型有兩種資料并行和任務并行,對應的較長的描述如下:
關鍵字 | 釋義 |
---|---|
data parallel | kernel對多個資料進行并行操作處理,互相資料見存在依賴性 |
task parallel | kernel資料處理是獨立互相間不存在依賴 |
對于data parallel 并行處理計算中資料同步是非常的必要的,opencl兩種粒度方式的資料同步,對應的描述如下表:
名稱 | 同步粒度 | 釋義 |
---|---|---|
work-group 同步 | work-group内 | work-group内的所有work-iterms同步 |
commands 同步(同一context) | 同一context下 | 基于同一context下的commands間的同步(1. 同一隊列内同步,2. 基于event的資料同步) |
三、附錄
3.1 名詞解釋
名字 | 釋義 |
---|---|
OpenCL Platform layer | The platform layer allows the host program to discover OpenCL devices and their capabilities and to create contexts. |
OpenCL Runtime | The runtime allows the host program to manipulate contexts once they have been created. |
OpenCL Compiler | The OpenCL compiler creates program executables that contain OpenCL kernels. The OpenCL C programming language implemented by the compiler supports a subset of the ISO C99 language with extensions for parallelism. |
規約運算 | 對一個輸入數組執行某種算子,産生更小結果的中間數組,該過程就是規約S |
3.2 OPENCL UML類圖
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-OodV9Tny-1617343931196)(D:\work\文檔\openclUml.png)]
符号 | 釋義 |
---|---|
* | 多個 |
0…1 | 沒有或者有一個 |
1…* | 一個或者多個 |
-> | 互相指導關系 |
連線雙端表示互相間的資料映射關系和UML的邏輯關系,但是“->”不代表連線雙端存在關系隻是雙端間的指導關系。
參考文檔: opencl-1.2.pdf