https://blog.csdn.net/zhouxuanyuye/article/details/80445076
1、工作組和工作項
OpenCL運行時系統會創建一個整數索引空間,索引空間是N維的值網格,N爲1、2或3,又稱NDRange。
執行內核的各個實例稱爲工作項(work-item)。工作項在整個索引空間中由一個全局ID標識,就像學校給學生用學號標識。
工作項組織爲工作組(work-group)。全局索引爲工作組指定了工作組ID(就像學校給班級編號),工作組內又爲工作項指定了局部ID(就像班級裏又爲學生編了號)。
所以,如何通過座標方式找到工作項。
(1)可以通過工作項的全局索引
(2)先通過工作組索引號,再通過局部索引號
使用(gx,gy)表示工作項的全局ID,全局索引工具大小爲(Gx,Gy)。
所以工作項的座標範圍爲[(0,Gx-1), (0,Gy-1)]。
用w表示工作組ID,W工作組各個維度的維度大小。
把一個工作組內的索引空間稱爲局部索引空間。各個維度的大小用字母L表示,局部ID使用小寫字母l表示。
因此,大小爲(Gx,Gy)的NDRange索引空間劃分爲Wx*Wy空間上的工作組,工作組的索引號爲(wx,wy)。各個工作組大小爲Lx*Ly。
Lx = Gx / Wx
Ly = Gy / Wy
通過工作項的全局ID(gx,gy)來定義工作項,或者通過局部ID(lx,ly)和工作組ID(wx,wy)定義:
gx = wx*Lx + lx
gy = wy*Ly + ly
全局索引空間各個維度起始點從0開始,不過在全局索引空間的起始點定義了一個偏移量,用小寫字母o表示
gx = wx*Lx + lx + ox
gy = wy*Ly + ly + oy
2、OpenCL編程中的一個核心函數是clEnqueueNDRangeKernel,對於此函數的理解,有利於對數據在host和device之間的傳遞進行控制。以二維數組爲例,先列出函數定義和示例,然後進行關鍵參數解釋
cl_int clEnqueueNDRangeKernel ( |
cl_command_queue command_queue, |
cl_kernel kernel, | |
cl_uint work_dim, | |
const size_t *global_work_offset, | |
const size_t *global_work_size, | |
const size_t *local_work_size, | |
cl_uint num_events_in_wait_list, | |
const cl_event *event_wait_list, | |
cl_event *event) |
size_t globalSize[2] = { 2048, 1024}, localSize[2] = { 16, 16 };// 注意不同函數需要調整工作組網格參數
// 執行內核
status = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, globalSize, localSize, 0, NULL, NULL);
command_queue和kernel是先前定義的隊列和內核函數,不用多說
work_dim代表數組維數,取值1,2,3.表示global_work_offset和global_work_size是幾維數組,此處填2代表是二維數組,因此global_work_offset、global_work_size和local_work_size必須都是二維數組
global_work_offset表示偏移量,1.2版本以前爲NULL
global_work_size表示work_dim維度下的長(寬深),此處是二維數組的長、寬。亦即上圖的Gx爲2048和Gy爲1024。get_global_size(0)值爲Gx,亦即2048,get_global_size(1)值爲Gy,亦即1024
local_work_size表示工作組組成的工作項大小,亦即上圖Lx爲16和Ly爲16,因此Wx=Gx/Lx=2048/16=128,Wy=Gy/Ly=1024/16=64,在kernel函數中get_local_size(0)值爲Lx,亦即16,get_local_size(1)值爲Ly,亦即16
3、工作項函數解釋
get_global_id(dimindx)返回工作項在全局中dimindx維度的ID
get_local_id(dimindx)返回工作項在工作組中dimindx維度的ID
get_num_groups(dimindx)返回工作組的數目,亦即Wx = get_num_groups(0)爲128, Wy = get_num_groups(1)爲64
get_group_id(dimindx)返回工作項所在工作組dimindx維度的ID