平衡块、线程和工作组?

Balancing blocks, threads and workgroups?

我有一个应用程序(不是我自己创建的)需要三个参数

它使用 OpenCL,我有一个 RX 580...我目前的效率很低

GPU在36个计算单元中有2304个模块

现在我尝试了不同的值,但我不知道什么是最佳起点,因为我不知道块和线程如何与计算单元相关。 在理解如何决定#of blocks、#of threads per block 和#of calcs per thread 方面提供任何帮助将不胜感激

非常感谢

我将做出与您相同的假设:

Blocks: Number of workgroups
Thread: Number of threads
Points: Some metric of work per thread

设置正确的工作组大小比工作组的数量更重要。您将希望组大小是 SIMD 宽度的最小值,在大多数 GPU 上通常为 32。所以 blocks 应该设置为 Threads / 32.

对于“积分”。这将取决于每个“计算”完成多少工作。启动工作组会产生开销,因此您要确保每个线程都有足够的工作要做。根据经验,~16 条指令通常就足够了。但是,如果您看不到内核代码,那么您将不得不进行试验。

总结:

  1. 设置“点数”,以便您至少有 2304 个线程来完成您需要的工作
  2. 将块设置为线程/32

所有这些都假设您至少有 2304 个工作项,否则您没有充分利用您的硬件。