1

我正在尝试在我的 AMD CPU 上使用 OpenCL 1.1 C++ 处理图像。

特点是:

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=558and l_height=328,l_localWorkSize不能大于 (2, 2) 否则,我得到这个错误:“无效的工作组大小”

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

4

2 回答 2

0

我在 OpenCL 规范中读到enqueueNDRangeKernel()如果l_globalWorkSize可以被l_localWorkSize. 就我而言,我可以将其设置为 (2,41)。

于 2013-01-02T14:16:58.590 回答
0

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

  • CL_DEVICE_MAX_WORK_GROUP_SIZE检查 4 对于您的工作组来说不是太大,并且

  • CL_DEVICE_MAX_WORK_ITEM_SIZES检查按维度划分的工作项的数量是否不太大。

并且组大小可能受限于内核数量这一事实是有道理的:如果您有工作项之间的通信/同步,您将希望它们同时执行,否则 OpenCL 驱动程序将不得不模拟这一点在一般情况下,这可能至少很难并且可能是不可能的。

于 2013-01-02T12:28:57.103 回答