处理Image2D时,工作组大小无效 我试图用OpenCL 1.1 C++在我的AMD CPU上处理一个图像。

处理Image2D时,工作组大小无效 我试图用OpenCL 1.1 C++在我的AMD CPU上处理一个图像。,opencl,Opencl,其特点是: using CPU: AMD Turion(tm) 64 X2 Mobile Technology TL-60 initCL:CL_DEVICE_IMAGE2D_MAX_WIDTH :8192 initCL:CL_DEVICE_IMAGE2D_MAX_HEIGHT :8192 initCL:timer resolution in ns:1 initCL:CL_DEVICE_GLOBAL_MEM_SIZE in bytes:1975189504 initCL:CL_DEVICE_GLO

其特点是:

using CPU: AMD Turion(tm) 64 X2 Mobile Technology TL-60
initCL:CL_DEVICE_IMAGE2D_MAX_WIDTH :8192
initCL:CL_DEVICE_IMAGE2D_MAX_HEIGHT :8192
initCL:timer resolution in ns:1
initCL:CL_DEVICE_GLOBAL_MEM_SIZE in bytes:1975189504
initCL:CL_DEVICE_GLOBAL_MEM_CACHE_SIZE in bytes:65536
initCL:CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE in bytes:65536
initCL:CL_DEVICE_LOCAL_MEM_SIZE in bytes:32768
initCL:CL_DEVICE_MAX_COMPUTE_UNITS:2
initCL:CL_DEVICE_MAX_WORK_GROUP_SIZE:1024
initCL:CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:3
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=0, size 1024
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=1, size 1024
initCL:CL_DEVICE_MAX_WORK_ITEM_SIZES:dim=2, size 1024
createCLKernel:mean_value
createCLKernel:CL_KERNEL_WORK_GROUP_SIZE:1024
createCLKernel:CL_KERNEL_LOCAL_MEM_SIZE used by the kernel in bytes:0
createCLKernel:CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:1
内核目前是空的:

__kernel void mean_value(image2d_t p_image,                 
                     __global ulong4* p_meanValue) 
 {

 }
执行调用是:

cl::NDRange l_globalOffset;
// The global worksize is the entire image
cl::NDRange l_globalWorkSize(l_width, l_height);
// Needs to be determined
cl::NDRange l_localWorkSize;//(2, 2);
// Computes the mean value
cl::Event l_profileEvent;
gQueue.enqueueNDRangeKernel(gKernelMeanValue, l_globalOffset, l_globalWorkSize,
  l_localWorkSize, NULL, &l_profileEvent);
如果l_width=558,l_height=328,l_localWorkSize不能大于2,否则,我会得到以下错误:工作组大小无效

是因为我只有两个内核吗?
是否有确定l_localWorkSize的规则?

您可以使用clGetDeviceInfo函数检查两件事:

CL_设备\u最大\u工作\u组\u大小,以检查4对于您的工作组和

CL_设备_最大_工作_项目_大小,以检查按维度划分的工作项目数量是否过大


事实上,组大小可能限制在内核的数量上是有意义的:如果您有工作间项目通信/同步,那么您希望同时执行它们,否则,OpenCL驱动程序将不得不模拟这一点,这在一般情况下可能至少是困难的,而且可能是不可能的。

我在OpenCL规范中读到,如果l_globalWorkSize可以被l_localWorkSize平均整除,enqueueNDRangeKernel将成功。在我的例子中,我可以将其设置为2,41。

我在问题中显示了这些值。我担心的是,它们远远高于4。因此,问题可能是由于工作组的数量:558*328/2*2=45756。如果本地大小为1,1,则可以使用更大的本地工作大小,达到上述限制,再加上几个,但必须使全局工作大小为本地工作大小的倍数。然后将实际所需的全局工作大小作为参数传递给内核,首先检查全局ID是否在所需大小内。@Dithermaster:是。在处理内核中的数据之前,我采用了一种方法,即在图像大小上方找到最接近的2次方,并将其与真实维度进行比较。我想一定有更聪明的算法,但我经验不足。两个的力量太大了。只需找到一个好的本地工作尺寸8x8,16x8,并制作一个倍数的全局尺寸。很抱歉没有提及。阅读一半的问题,写一半的我的答案::还有一个原因。但是你已经用1,1测试过了,它是有效的?你完全正确,它应该是均匀可除的。所以我假设你解决了你的问题,或者你不能将X维度设置为大于2?这只发生在AMD CPU实现上吗?你试过其他OpenCL驱动程序吗?@TomiAarnio:没有,我没有试过其他驱动程序