是否有任何理由让OpenCL标准选择使用参数类型const size_t *
而不是仅在clEnqueueNDRangeKernel
函数中传递const size_t
?为什么OpenCL的clEnqueueNDRangeKernel使用const size_t *作为参数?
这个决定背后的推理是什么?
如果将标准clEnqueueNDRangeKernel
定义为使用const size_t
而不是const size_t *
,性能或其他指标是否会有任何变化?
谢谢
是否有任何理由让OpenCL标准选择使用参数类型const size_t *
而不是仅在clEnqueueNDRangeKernel
函数中传递const size_t
?为什么OpenCL的clEnqueueNDRangeKernel使用const size_t *作为参数?
这个决定背后的推理是什么?
如果将标准clEnqueueNDRangeKernel
定义为使用const size_t
而不是const size_t *
,性能或其他指标是否会有任何变化?
谢谢
一切都在manual解释。基本上const size_t *
参数用于传递数组。在使用2维和3维时,需要数组传递工作项的数量。下面的一些重要片段提取:
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)
global_work_offset - 目前必须为NULL值。在未来版本的OpenCL中,global_work_offset可用于指定work_dim无符号值的数组...
global_work_size - 指向一个work_dim无符号值数组,它描述work_dim维中的全局工作项数执行内核函数...
local_work_size - 指向一组work_dim无符号值,它描述构成工作组的工作项数(也称为工作组大小)将执行内核指定的内核...
示例:
size_t global[2] = {1024, 1024};
size_t local[2] = {64, 64};
clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, local, 0, NULL, NULL);
这使得总体感觉。谢谢!下次我需要更仔细地阅读手册。我只想象work_dim = 1的情况。 – user27653
也许它可以让你在排队后但在执行实际命令之前改变全局范围。没有这一点,它将在入队时保持不变。或者,当你将null留给本地范围时,它会进行自动调整,也许它将该值放在那个地方,但我没有试图检查它。 –