当前位置: 代码迷 >> 综合 >> OpenCl 对维度,工作项,工作组概念的理解
  详细解决方案

OpenCl 对维度,工作项,工作组概念的理解

热度:60   发布时间:2023-12-22 11:14:03.0

Enqueues a command to execute a kernel on a device.
-对命令进行排队,以便在设备上执行内核。
在这里插入图片描述

参数

command_queue
一个有效的命令队列。内核将在与command_queue关联的设备上排队执行。

kernel
一个有效的内核对象。与kernel和command_queue关联的OpenCL上下文必须是相同的。

work_dim
用于指定全局工作项和工作组中的工作项的维数。Work_dim必须大于0且小于或等于3。

global_work_offset
当前必须是NULL值。在OpenCL的未来版本中,global_work_offset可以用来指定一个work_dim无符号值数组,用来描述用于计算工作项全局ID的偏移量,而不是让全局ID总是从offset(0,0,…0).

global_work_size
指向一个work_dim无符号值数组,该数组描述work_dim维度中将执行内核函数的全局工作项的数量。全局工作项的总数被计算为global_work_size[0] global_work_size[work_dim - 1]。
global_work_size中指定的值不能超过内核执行将在其上排队的设备的sizeof(size_t)给出的范围。设备的sizeof(size_t)可以通过使用clGetDeviceInfo的OpenCL设备查询表中的CL_DEVICE_ADDRESS_BITS来确定。例如,如果CL_DEVICE_ADDRESS_BITS = 32,即设备使用32位地址空间,则size_t是32位无符号整数,global_work_size值必须在1范围内。2 ^ 32 - 1。超出此范围的值将返回CL_OUT_OF_RESOURCES错误。

local_work_size
指向work_dim无符号值的数组,该数组描述组成工作组的工作项的数量(也称为工作组的大小),这些工作项将执行由kernel指定的内核。工作组中工作项的总数计算为local_work_size[0] local_work_size[work_dim - 1]。工作组中工作项的总数必须小于或等于在OpenCL设备查询clGetDeviceInfo表中指定的CL_DEVICE_MAX_WORK_GROUP_SIZE值和在local_work_size[0],…local_work_size [work_id]。实际情况由于设备和内核的不同,导致该参数在设置时候不同,要根据硬件配置来设置。尝试clGetKernelWorkGroupInfo(),获取local_work_size

event
返回标识此特定内核执行实例的事件对象。事件对象是惟一的,以后可以用来标识特定的内核执行实例。如果event为NULL,则不会为这个内核执行实例创建任何事件,因此应用程序将不可能查询或排队等待这个特定的内核执行实例。一般用于GPU 运算耗时统计。

说明和理解

参数global_work_size,是指定全局工作项的个数
参数local_work_size,是指定工作组的大小,即一个工作组中有多少个工作项。
那么呼之欲出,工作组的个数就=global_work_size/local_work_size

维度这个参数,就是实际要处理数据的维度
如果是一维数组那么维度就是1,如果是二维数组或者说是一个map, 那么维度就是2、最大的就是3维。
可以理解成一个田字格本,每一个田字格就是一个工作项,全页有多少个田字格那么他的global size 就是多少。一行有多少个工作项,那么一行的工作项个数就是工作组的大小,被称为group size.
一页有多少行,那么就有多少个工作组。那么:group num = global size/ group size。

还有,函数原型可以看出,global size 和 local size 是个指针类型,实际这个参数的个数由他的维度所决定,如果维度是2,那么你就必须要定义两个维度的global size 和 local size.

offset 这个参数,顾名思义就是偏移,kernel在实际运算是指定哪个工作项进行运算,一般都是由这个参数决定。如果是从头开始,那么一般都设置NULL。