Opencl CL\u无效\u工作\u组\u大小错误

Opencl CL\u无效\u工作\u组\u大小错误,opencl,Opencl,我有这个代码,不久前我已经发布了一些东西 今天我在一个小测试程序中使用typedef结构运行内核,但是clEnqueueNDRangeKernel给出了一个无效的工作组大小错误。根据khronos webiste的说法,这可能有三个原因 全局工作大小不能被本地工作大小整除。在我的代码中,它是可除的 本地工作大小超出GPU的处理能力。我的本地工作大小是128,远远低于报告的最大值1024 与NULL的本地工作大小有关。我的本地工作大小不是NULL,而是128 我在互联网上搜索了好几个小时,我找到的

我有这个代码,不久前我已经发布了一些东西

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

  • 全局工作大小不能被本地工作大小整除。在我的代码中,它是可除的
  • 本地工作大小超出GPU的处理能力。我的本地工作大小是128,远远低于报告的最大值1024
  • NULL
    的本地工作大小有关。我的本地工作大小不是
    NULL
    ,而是128
  • 我在互联网上搜索了好几个小时,我找到的大多数解决方案都涉及到查询
    clGetKernelWorkGroupInfo
    以获得最大的本地工作规模。当我这样做时,它也会报告1024个。我现在真的没办法了,有人能帮我吗?:)


    main:kernel:

    从您的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。这几乎肯定不是你想要的。请记住,全局大小是要运行的工作项总数,而本地大小是每个工作组的大小。例如,如果全局大小为1024x1024,本地大小为16x16,则将有4096个工作组,每个工作组包含256个工作项。这可能有效,也可能无效,具体取决于您的计算设备


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

    这当然是我想要的:)为什么你认为这不是我想要的?这段代码对我来说是一些练习,如果我掌握了窍门,这将是一个相当大的程序。所以我在做这件事时考虑到了未来的扩展。不管你想要什么,你必须确保全局大小>=local大小。让我给你一个1D的例子。假设您有10000件事情要用CL内核处理。这就是你的全球规模:10000。也许你想一组100件事情来处理这些。这是你们当地的尺码:100。因为10000/100==100,所以这种特殊的安排将为您提供100个工作组。在上面,全局大小为16,局部大小为128。这对OpenCL--16/128没有意义。也许您想要16*128作为您的全局大小,128作为您的本地大小?这将产生16个工作组,每个工作组包含128项。aaah,那么您的全局工作大小是您想要的计算总数,而本地工作大小是您想要的块大小?嗯,现在这更有意义了:)