OpenCL函數clEnqueueNDRangeKernel 解析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章