OpenCL clEnqueueNDRangeKernel work_dim VS global_work 数组元素
OpenCL clEnqueueNDRangeKernel work_dim VS global_work array elements
我是 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_dim
字段),这意味着:
- 维度 0 内核得到的线程数等于
BLOCK_SIZE
并且只有一组(我猜组数可以这样计算 => ( global_work1[0] ) / ( local_work1[0] )
)。
- 维度 1 内核得到的线程数等于 1,并且只有一组。
以及为什么在 global_work1
和 local_work1
.
中有三个元素时在队列指令中指定维度为 2
你在告诉 CL:
"Run this kernel, in this queue, with 2D and these global/local sizes"
CL 仅获取参数的前两个维度,而忽略第三个维度。
关于一维和二维的区别。有none。由于作为 1D 启动的 OpenCL 内核不会在 get_global_id(1)
和 get_global_id(2)
调用时失败。他们只会 return 0。所以除了提示内核可能支持更大尺寸的第二维参数(即:512x128)
外,根本没有区别
我是 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_dim
字段),这意味着:
- 维度 0 内核得到的线程数等于
BLOCK_SIZE
并且只有一组(我猜组数可以这样计算 =>( global_work1[0] ) / ( local_work1[0] )
)。 - 维度 1 内核得到的线程数等于 1,并且只有一组。
以及为什么在 global_work1
和 local_work1
.
你在告诉 CL: "Run this kernel, in this queue, with 2D and these global/local sizes"
CL 仅获取参数的前两个维度,而忽略第三个维度。
关于一维和二维的区别。有none。由于作为 1D 启动的 OpenCL 内核不会在 get_global_id(1)
和 get_global_id(2)
调用时失败。他们只会 return 0。所以除了提示内核可能支持更大尺寸的第二维参数(即:512x128)