OpenCL工作项和工作组

OpenCL工作项和工作组,opencl,Opencl,我正在GPU上运行内核,使用NDRange和 全球规模:32 本地尺寸:16 尺寸:1 现在,当我查看来自缓冲区的结果时,我可以看到来自每个工作项的值。现在,从工作项32到512,值都是0,因此我认为并非所有工作项都在运行 我正在使用get_global_id(0)获取工作项的id 这怎么可能?如果我运行512个工作组,每个工作组有一个工作项,那么它可以正常工作。我错过了什么 谢谢大家在排队过程中指定的全局大小仍然必须是512-这不是组的数量,而是项目的总数。get\u global\u id(

我正在GPU上运行内核,使用NDRange和 全球规模:32 本地尺寸:16 尺寸:1

现在,当我查看来自缓冲区的结果时,我可以看到来自每个工作项的值。现在,从工作项32到512,值都是0,因此我认为并非所有工作项都在运行

我正在使用get_global_id(0)获取工作项的id

这怎么可能?如果我运行512个工作组,每个工作组有一个工作项,那么它可以正常工作。我错过了什么


谢谢大家

在排队过程中指定的全局大小仍然必须是512-这不是组的数量,而是项目的总数。

get\u global\u id(0)
给出了一个工作项自己的id。请这样想:

// gpu driver runs this
void gpu(int global_size)
{
    for(0 to global_size)
    {
        produce(
        {
           auto get_global_id=[](int dimension){ return loop_counter; };
           virtual void kernel( params ... )
           {
                 yourKernelCodeHere
           }
        }, toQueue);
    }
}

// compute units run this

while(fromQueue is not empty)
{
     consume(local_size_chunks, fromQueue);
}
Workitem是定义为内核的工作单元/工作者

本地大小是每个组的工作项数。组的工作项共享1个计算单元的资源。1个计算单元包含本地内存、缓存、alu等

全局大小是本地大小的整数倍,因此可以运行N个组

从CPU的角度来看,每个工作项可以是线程、光纤或SIMD的通道

从GPU的角度来看,每个工作项都可以是一个通过alu的命令列表

从CPU的角度来看,工作组(size =本地)可以是一个矢量化的C++循环,甚至可以使用多个线程展开它。


从GPU的角度来看,一个工作组可以是一个固定的并行命令流(类似于奔腾的双重问题,但范围更广),您可以选择不使用一个计算单元的所有核心,即使只能使用1个,但效率很低。

您是cuda的吗?在这里,人们从组数中得出总线程数,但在这里,您从总线程数中得出组数。所以你只需要工作项目?然后传递全局大小。然后改变本地大小会改变组大小,该组大小决定每个计算单元可以运行多少组。512全局+16局部=32个组,那么每个计算单元最好少于16个核,以最大限度地降低效率。是的,我有点来自CUDA。那么在这种情况下,为什么你说每个计算单元最好少于16个核心呢?Opencl工作项SCGEDULLING不能使用所有核心,因为飞行中的组在相同的跑道上工作,ilp较少。我的意思是amd gpu变得非常慢,每个组只有16个项目。我真的希望有人能向我解释这个组是如何工作的。因为我一直认为本地和全球是相反的。如果这是真的,那么为什么我没有得到其他工作项的结果?!您定义了16=本地大小,32=全局大小,因此仅检索2个组来计算单位。512个工作项需要全局大小512。最快的计算单元(可能有很多内核)需要消耗16个工作项,然后下一个最快的计算单元需要消耗另外16个工作项,全部完成。是的,但是16x32是512个工作项。正如你所说,每个工作项都是一个工作单元,不是16x32,而是32/16组。2组。2x16=32个工作项(您的意思)。您对gpu说:“有32个工作项,但在16个宽块中使用它们”。好吧,如果我设置为512x32。我得到无效的命令队列。这意味着什么?