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

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