通过前面教程的学习,我们分别创建了关联选定设备的上下文、命令对象、程序对象以及内核对象,OpenCL代码在设备上执行的前期准备都已准备好,本文讲述如何让内核函数在设备上执行。利用命令队列使将在设备上执行的内核排队,是通过如下函数完成的:
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 sizse_t *local_work_size,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
-
参数command_queue为提交内核执行任务的命令队列,命令队列创建时关联了指定的设备,command_queue关联的设备就是最后执行内核函数的设备。
-
参数kernel为在设备上执行的内核函数。
-
参数work_dim指定设备上执行内核函数的全局工作项的维度。最小为值1,最大值为CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS。
-
参数global_work_offset为全局工作项ID的偏移量。如果global_work_offset为NULL,则偏移量为0。在目前的大多数设备上,此参数必须设置为NULL。
-
参数global_work_size指定全局工作项的大小。
-
参数local_work_size为一个工作组内工作项的大小。[插图]参 数work_dim、global_work_offset、global_work_size和local_work_sizse的 用 法。
- 参数num_events_in_wait_list和event_wait_list指定了在执行内核操作之前,需要等待num_evetns_in_wait_list各event_wait_list中的事件执行完成。
- 参数event指向这个命令生成的一个事件对象。后续的命令或主机可以使用这个事件的状态来控制其他操作。