clEnqueueNDRangeKernel返回CL_INVALID_WORK_GROUP_SIZE

时间:2016-10-26 20:00:27

标签: opencl

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

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

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

在设置内核,设置参数等之后,一切看起来都不错。前两个设备接受内核并开始运行,但第三个设备拒绝它并返回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并共享一个缓冲区对象有任何限制吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

好的,我找出了问题所在。 CPU支持最大工作项大小(1024,1,1),因此本地工作大小无法使用(32x32)。

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

答案 1 :(得分:0)

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

查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE总是返回1,即使是一个没有障碍的非常简单的内核。在这种情况下,工作组大小可以是128(它是一维工作组),但不能是256。

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