OpenCL 工作项和工作组

OpenCL Work-Items and Work-Groups

我运行在 GPU 上使用 NDRange 和 全球规模:32 局部尺寸:16 维度:1

现在,当我查看缓冲区的结果时,我可以看到来自每个工作项的值。现在从工作项 32 到 512 的值是 0 所以这让我觉得并不是所有的工作项都是 运行ning.

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

怎么会这样?如果我 运行 512 个工作组,每个工作组有 1 个工作项,那么它工作正常。我错过了什么?

谢谢大家

您在入队期间指定的全局大小仍必须为 512 - 它不是组数,而是项目总数。

get_global_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 是work/worker定义为内核的一个单元。

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

全局大小是局部大小的整数倍,所以N个组可以是运行。

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

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

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

从GPU的角度来看,一个workgroup可以是一个clamped parallel command stream(类似于pentium的dual-issue但更宽),你可以选择不使用一个计算单元的所有核心,甚至可以只使用1个但效率低下。