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个但效率低下。
我运行在 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个但效率低下。