OpenCL:只关心线程全局ID的理想block #

OpenCL: The Ideal # of Blocks when only caring about thread global ID?

本文关键字:理想 block ID 全局 关心 线程 OpenCL      更新时间:2023-10-16

所以我对OpenCL很陌生,我正在努力更好地理解工作组和工作项。我理解一个组中的所有线程(项)共享内存、原子操作和屏障同步。

然而,如果我不需要这些好处,只关心任何给定线程的全局ID怎么办?:

get_global_id(0)

如果我只关心线程的总数,那么我应该如何选择有多少组和每个组应该有多少项呢?(=组*项/组)

例如,假设我有一个程序来计算一个400x400矩阵。我总共有160,000条线。最初我想(天真地)让我们把它们都放在一个块中,然而这远远超过了每个块允许的线程限制。然后我选择一个任意#的块:1600个,每个块有100个线程。我的平均加速速度是CPU单线程的x5.5(我还没有一个好的GPU来运行我的代码…)。所以我想,既然我没有使用块,为什么不给每个线程自己的块?我的平均加速是x4.5。因此,为每个线程分配自己的块会更慢。

这里究竟发生了什么,我假设创建块有一些额外的开销?我如何计算我应该拥有的块的最佳数量?最优的解决方案就是尽可能少地建造街区吗?

一个选择是给clEnqueueNDRangeKernelNULLlocal_work_size参数,在这种情况下,OpenCL实现将自己决定本地大小。这可能不会给出最优结果,但至少OpenCL实现会尝试猜测最优的局部大小。

另外,clGetKernelWorkGroupInfo可以用来查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE