【问题标题】:Causes for CL_INVALID_WORK_GROUP_SIZECL_INVALID_WORK_GROUP_SIZE 的原因
【发布时间】:2011-07-30 06:05:44
【问题描述】:

当我将工作组大小从 16 更改为 32 或更大时,我收到 CL_INVALID_WORK_GROUP_SIZE 错误。 matrix_size64

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

首先我检查了clEnqueueNDRangeKernel 的文档,其中说明了四(五)个不同的原因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.

A 我查询clGetDeviceInfoCL_DEVICE_MAX_WORK_GROUP_SIZE512, 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.

A 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


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

感谢您抽出宝贵时间阅读所有内容:)

【问题讨论】:

  • 这个问题很老了,但我只是想感谢你这个非常清楚的解释,因为它刚刚找到了我的问题的解决方案!
  • @BigBourin。你很受欢迎。如果您还没有回答,也请 +1 Quantumboredom 回答。

标签: opencl


【解决方案1】:

当我试图在 CPU 上运行我的内核时,我遇到了同样的问题。我无法将工作组大小设置为超过 128,而 CL_DEVICE_MAX_WORK_GROUP_SIZE 返回 1024。
经过一番搜索以找出 128 的来源,结果发现 CL_KERNEL_WORK_GROUP_SIZE 给出了正确的值。

【讨论】:

    【解决方案2】:

    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 的定义:

    使用数据并行执行模型执行内核的工作组中的最大工作项数。

    【讨论】:

    • 非常感谢。我确实使用相同的变量来读取 CL_DEVICE_MAX_WORK_ITEM_SIZES 和 CL_DEVICE_MAX_WORK_GROUP_SIZE 而无需清除。像往常一样,错误更加平凡......
    • 供人们参考,OpenCL 1.1 规范khronos.org/registry/OpenCL/specs/opencl-1.1.pdf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2017-04-10
    • 1970-01-01
    • 2014-05-31
    • 2015-12-30
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多