OpenCL 工作项和工作组



>我正在使用 NDRange 在 GPU 上运行内核 全球大小:32 本地大小: 16 尺寸: 1

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

我使用 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);
}

工作项是定义为内核的工作/工作器单元。

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

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

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

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

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

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

最新更新