2011-04-05 104 views
23

当我将工作组大小从16更改为32或更大的东西我得到一个CL_INVALID_WORK_GROUP_SIZE错误。 matrix_size64原因为CL_INVALID_WORK_GROUP_SIZE

localWorkSize[0] = groupsize; 
    localWorkSize[1] = localWorkSize[0]; 
    globalWorkSize[0] = matrix_size; 
    globalWorkSize[1] = globalWorkSize[0]; 

首先我检查了文档clEnqueueNDRangeKernel其中规定四(5个)不同的原因CL_INVALID_WORK_GROUP_SIZE,但我认为他们不适用。请检查我的结论。 (我希望你不介意我的QA风格)


QCL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and number of work-items specified by global_work_size is not evenly divisable by size of work-group given by local_work_size

一个64%32 = 0

Qor does not match the work-group size specified for kernel using the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier in program source.

A据我了解的帮助,我没有使用__attribute__

QCL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and the total number of work-items in the work-group computed as local_work_size[0] *... local_work_size[work_dim - 1] is greater than the value specified by CL_DEVICE_MAX_WORK_GROUP_SIZE in the table of OpenCL Device Queries for clGetDeviceInfo.

我查询clGetDeviceInfoCL_DEVICE_MAX_WORK_GROUP_SIZE512, 512, 64

QCL_INVALID_WORK_GROUP_SIZE if local_work_size is NULL and the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier is used to declare the work-group size for kernel in the program source.

local_work_size不是NULL

QCL_INVALID_WORK_ITEM_SIZE if the number of work-items specified in any of local_work_size[0], ... local_work_size[work_dim - 1] is greater than the corresponding values specified by CL_DEVICE_MAX_WORK_ITEM_SIZES[0], .... CL_DEVICE_MAX_WORK_ITEM_SIZES[work_dim - 1].

一个


我希望,我没有忽略的东西。请告诉我,当你知道什么可能会导致CL_INVALID_WORK_GROUP_SIZE或在我的结论中发现错误。

感谢您抽出宝贵的时间来阅读这一切:)

+0

这个问题很老,但我只是想感谢你这个非常明确的解释,因为它只是找到了解决我的问题的方法! – 2012-02-22 14:28:54

+0

@BigBourin。你非常欢迎。如果您还没有做过,请还请+1 Quantumboredom回答。 – Framester 2012-02-22 14:38:46

回答

14

CL_DEVICE_MAX_WORK_GROUP_SIZE应该返回同一个size_t值(例如512,但我不知道它会是你的系统上)。这是工作组中工作项目的最大数量,而不是每个维度中的最大数量。所以在你的情况下,你试图制作一个32 * 32 = 1024工作项目的2D工作组,并且大概CL_DEVICE_MAX_WORK_GROUP_SIZE在你的系统上小于1024。

请参阅OpenCL 1.1规范表4。3,37页,CL_DEVICE_MAX_WORK_GROUP_SIZE定义:

在一个工作组执行使用数据并行执行模型内核工作项的最大数目。

+1

非常感谢。我确实使用相同的变量来读取CL_DEVICE_MAX_WORK_ITEM_SIZES和CL_DEVICE_MAX_WORK_GROUP_SIZE而不清除。像往常一样,错误更为普通...... – Framester 2011-04-06 14:05:07

+0

对于人们的参考,OpenCL 1.1规范https://www.khronos.org/registry/OpenCL/specs/opencl-1.1.pdf – 2017-12-28 22:32:02

0

当我试图在CPU上运行我的内核时,我遇到了同样的问题。我无法将工作组大小设置为128以上,而CL_DEVICE_MAX_WORK_GROUP_SIZE则返回1024.
经过一点搜索后,找出其中128个来自哪个结果CL_KERNEL_WORK_GROUP_SIZE正在给出适当的值。