当我将工作组大小从16
更改为32
或更大的内容时,我收到CL_INVALID_WORK_GROUP_SIZE
错误。 matrix_size
是64
。
localWorkSize[0] = groupsize;
localWorkSize[1] = localWorkSize[0];
globalWorkSize[0] = matrix_size;
globalWorkSize[1] = globalWorkSize[0];
首先,我检查了clEnqueueNDRangeKernel的文档,其中列出了四(5)个不同的原因CL_INVALID_WORK_GROUP_SIZE
,但我认为它们不适用。请检查我的结论。 (我希望你不介意我的QA风格)
问 CL_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
A 64%32 = 0
问 or 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__
。
问 CL_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.
我查询clGetDeviceInfo
而CL_DEVICE_MAX_WORK_GROUP_SIZE
是512, 512, 64
问 CL_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
。
问 CL_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].
A 32< 512
我希望,我没有忽视某些事情。请告诉我,当您知道可能导致CL_INVALID_WORK_GROUP_SIZE
的原因或在我的结论中发现错误时。
感谢您花时间阅读所有内容:)
答案 0 :(得分:17)
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 :(得分:0)
当我尝试在CPU上运行内核时遇到了同样的问题。我无法将工作组大小设置为超过128,而CL_DEVICE_MAX_WORK_GROUP_SIZE
返回1024
经过一些搜索,找出128来自哪里,结果CL_KERNEL_WORK_GROUP_SIZE
给出了正确的值。