clEnqueueNDRangeKernel return CL_INVALID_WORK_GROUP_SIZE

clEnqueueNDRangeKernel return CL_INVALID_WORK_GROUP_SIZE

我的 MacBookPro 上有 3 个 OpenCL 设备,所以我尝试用一​​个小的示例进行一些复杂的计算。

我创建了一个包含 3 个设备的上下文,两个是 GPU,一个是 CPU。然后创建 3 个命令队列,一个来自(或用于)它们中的每一个。

然后创建一个大的全局缓冲区,大但不大于任何一个设备中可用的最小缓冲区。然后从输入缓冲区创建 3 个子缓冲区,它们的大小都是经过仔细计算的。还创建了另一个不太大的输出缓冲区,并在其上创建了 3 个小的子缓冲区。

在设置内核、设置参数等之后,一切看起来都很好。前两个设备接受内核并开始 运行,但第三个拒绝它并且 return CL_INVALID_WORK_GROUP_SIZE.

我不想在这里放任何源代码,因为它们没什么特别的,而且我确信其中没有错误。

我做了一些日志如下:

command queue 0
device: Iris Pro max work group size 512
local work size(32 * 16) = 512
global work size(160 * 48) = 7680
number of work groups = 15

command queue 1 
device: GeForce GT 750M max work group size 1024
local work size(32 * 32) = 1024
global work size(160 * 96) = 15360
number of work groups = 15

command queue 2 
device: Intel(R) Core(TM) i7-4850HQ CPU @ 2.30GHz max work group size 1024
local work size(32 * 32) = 1024
global work size(160 * 96) = 15360
number of work groups = 15  

我检查了前两个输出是正确的,所以内核和主机代码一定是正确的。
我能想到的只有一种可能,同时使用CPU和GPU共享一个缓冲对象有没有限制?

提前致谢。

好的,我找到问题了。 CPU 支持最大工作项大小 (1024, 1, 1),因此本地工作大小不能使用 (32x32)。

但是当使用大于 (1, 1) 的本地工作大小时仍然有问题。继续努力。

来自英特尔的 OpenCL 指南: https://software.intel.com/en-us/node/540486

查询 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE return 始终为 1,即使使用非常简单的无障碍内核也是如此。在那种情况下,工作组大小可以是 128(它是一维工作组),但不能是 256。

结论在某些情况下最好不要使用它:(