【发布时间】:2015-11-09 19:16:14
【问题描述】:
我是 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。
【问题讨论】:
-
可能只有这些数组的前两个元素将用作 2D 执行。
-
是的,但这听起来很奇怪,特别是对于数组的第二个元素...... 1 组中的 1 个线程......没有任何意义。可能我对 OpenCL 的理解有问题。谢谢你的评论!!!!!!
-
我同意这段代码看起来不正确。
-
它正在执行 BLOCK_SIZE x 1 大小的块。
-
它们不会被忽略。你告诉 enqueue 函数注意前两个。只是第二个是 1。n*1 是一个有效的大小,就像 1 个工作项的一维启动是有效的一样。相当于请求一维,但实际上和忽略参数不一样。