OpenCL ClenqueEndRange内核工作数组元素与全局工作数组元素

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\

我是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);
因此,在
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启动是有效的。这相当于请求一个维度,但实际上与忽略参数不同。