【问题标题】:CL_INVALID_WORK_GROUP_SIZE errorCL_INVALID_WORK_GROUP_SIZE 错误
【发布时间】:2013-03-19 21:10:12
【问题描述】:

我有这段代码,前段时间我已经发布了一些内容。

今天我在一个小测试程序中使用 typedef 结构运行我的内核,但是 clEnqueueNDRangeKernel 给出了一个无效的工作组大小错误。根据 khronos webiste,这可能有 3 个原因。

  1. 全局工作大小不能被本地工作大小整除。在我的代码中,它是可分的。
  2. 本地工作大小大于 GPU 可以处理的大小。我的本地工作量为 128,远低于报告的最大值 1024。
  3. NULL 的本地工作大小有关。我的本地工作规模不是NULL,而是 128。

我已经在互联网上搜索了好几个小时,我发现的大多数解决方案都涉及查询 clGetKernelWorkGroupInfo 以获取最大本地工作大小。当我这样做时,它也会报告 1024。我现在真的没有选择,有人可以帮忙吗? :)

主:http://pastebin.com/S6R6t3iF 内核:http://pastebin.com/Mrhr8B4v

【问题讨论】:

    标签: opencl


    【解决方案1】:

    从您的 pastebin 链接中,我看到:

    #define MAX_OP_X 4
    #define MAX_OP_Y 4
    #define MAX_OP MAX_OP_X * MAX_OP_Y      //aantal observer points
    #define MAX_SEGMENTEN 128 //aantal segmenten
    ...
    size_t globalSize = MAX_OP;
    size_t localSize = MAX_SEGMENTEN;
    ...
    errMsg = clEnqueueNDRangeKernel (commandQueue, kernel, 1, NULL, &globalSize, &localSize, 0, NULL, NULL);
    

    这意味着您正在尝试将全局大小为 16,本地大小为 128 的内核排入队列。这几乎肯定不是您想要的。请记住,global size 是您要运行的工作项的总数,local size 是每个工作组的大小。例如,如果全局大小为 1024x1024,局部大小为 16x16,则您将拥有 4096 个工作组,每个工作组有 256 个工作项。这可能有效也可能无效,具体取决于您的计算设备。

    关于传递 NULL 本地大小:CL 规范说,如果你这样做,CL 实现可以选择任何它想要的作为本地工作组大小。理想情况下,它会尝试代表您做一些聪明的事情,但您无法保证。

    【讨论】:

    • 这当然是我想要的:) 为什么你认为这不是我想要的?这段代码对我来说是一些练习,如果我掌握了它,这将是一个相当大的程序。所以我在考虑未来的扩展时做了这个。
    • 随心所欲,必须确保 global_size >= local_size
    • 好吧,让我给你一个一维的例子。假设您有 10,000 个要使用 CL 内核处理的东西。这是您的全球规模:10,000。也许你想以 100 件事情为一组来处理这些事情。那是您的本地大小:100。因为 10,000/100 == 100,所以这种特殊安排将为您提供 100 个工作组。上面,全局大小为 16,局部大小为 128。这对 OpenCL 没有意义——16 / 128。也许您希望 16*128 作为全局大小,而 128 作为局部大小?这将产生 16 个工作组,每个工作组 128 个项目。
    • aaah,所以你的全局工作量是你想要的计算总数,而本地工作量是你想要一个块有多大?嗯,现在更有意义了:)
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2015-03-25
    相关资源
    最近更新 更多