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。
结论在某些情况下最好不要使用它:(
我的 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。
结论在某些情况下最好不要使用它:(