OpenCL ClenqueEndRange内核工作数组元素与全局工作数组元素
我是OpenCL的新手,我正在努力理解这段代码:OpenCL ClenqueEndRange内核工作数组元素与全局工作数组元素,opencl,gpu,Opencl,Gpu,我是OpenCL的新手,我正在努力理解这段代码: size_t global_work1[3] = {BLOCK_SIZE, 1, 1}; size_t local_work1[3] = {BLOCK_SIZE, 1, 1}; err = clEnqueueNDRangeKernel(cmd_queue, diag, 2, NULL, global_work1, local_work1, 0, 0, 0); 因此,在clEnqueueNDRangeKernel2维中指定了内核(work\
size_t global_work1[3] = {BLOCK_SIZE, 1, 1};
size_t local_work1[3] = {BLOCK_SIZE, 1, 1};
err = clEnqueueNDRangeKernel(cmd_queue, diag, 2, NULL, global_work1, local_work1, 0, 0, 0);
因此,在clEnqueueNDRangeKernel
2维中指定了内核(work\u dim
字段),这意味着:
- 维度0内核得到的线程数等于
,并且只有一个组(我猜组数可以通过这种方式计算=>块大小
)(全局工作1[0])/(本地工作1[0])
- 维度1内核得到的线程数等于1,并且只有一个组
global\u work1
和local\u work1
中的元素时,为什么在队列指令中指定维度2,您告诉CL:
使用2D和这些全局/本地大小在此队列中运行此内核
CL只是得到参数的前两个维度,而忽略了第三个维度
关于一维和二维之间的差异。没有。由于作为1D启动的OpenCL内核不会在
get\u global\u id(1)
和get\u global\u id(2)
调用中失败。它们将返回0。因此,除了提示内核可能支持更大的第二维度参数(即:512x128)之外,没有任何区别。可能只有这些数组的前两个元素将用作2D执行。是的,但听起来很奇怪,特别是关于数组的第二个元素。。。。1组中有1个螺纹。。。。。没有任何意义。我对OpenCL的理解可能有缺陷。谢谢你的评论!!!!!我同意这段代码看起来不正确。它执行的块大小为x 1大小的块。它们不会被忽略。您告诉排队函数注意前两个。只是秒是1。n*1是有效的大小,就像1个工作项的1-D启动是有效的。这相当于请求一个维度,但实际上与忽略参数不同。