OpenCL global worskize在Haswell和Kabylake iGPUs上的解释不同

OpenCL global worskize在Haswell和Kabylake iGPUs上的解释不同,opencl,Opencl,我们的内核初始化为: size_t localWorkSize[1] = {1}; size_t globalWorkSize[2] = {60, 80}; 内核在图像文件上实现了典型的卷积。 它可以在带有Kabylake iGPU的机器上正常工作,但在Haswell或Bay Trail机器上执行时,全局工作大小被解释为{60,60},因此执行的NDRange错误 在所有系统上,我们的平台都是OpenCL 1.2 beignet 1.3 这是一个已知的问题吗?或者全局工作大小是否存在硬件相关限

我们的内核初始化为:

size_t localWorkSize[1] = {1};
size_t globalWorkSize[2] = {60, 80};
内核在图像文件上实现了典型的卷积。 它可以在带有Kabylake iGPU的机器上正常工作,但在Haswell或Bay Trail机器上执行时,全局工作大小被解释为{60,60},因此执行的NDRange错误

在所有系统上,我们的平台都是OpenCL 1.2 beignet 1.3


这是一个已知的问题吗?或者全局工作大小是否存在硬件相关限制?OpenCL编程指南中似乎没有关于这方面的任何信息。

本地工作大小和全局工作大小必须具有相同的维度。请参阅有关ClenqueueEndRangeKernel的文档:

local_work_size  Points to an array of work_dim unsigned values
global_work_size  Points to an array of work_dim unsigned values
所以你的代码

size_t localWorkSize[1] = {1};
size_t globalWorkSize[2] = {60, 80};
如果您将内核与这些和workdim==2一起排队,那么驱动程序会将其读取为

size_t localWorkSize[2] = {1, something};
size_t globalWorkSize[2] = {60, 80};
其中某物是localWorkSize上面堆栈上的任何内容。你需要做什么

size_t localWorkSize[2] = {1, 1};

听起来像是你需要向Beignet开发人员提出的一个bug。就是这样。非常感谢你。