4

我在我的 K20 上运行一个关于并发内核执行资源的问题。我的流只有一点重叠,然后我认为这可能是因为资源限制。所以我参考了手册,我发现:每个多处理器的最大驻留块数是 16,每个多处理器的最大驻留线程数是 2048。

所以我的问题是:如果我在每个块中有 96 个块的 1024 个线程的内核。这个内核将并行使用多少个 SM?

答案 1:96/16 = 6

答案 2:1024/2048*96 = 48(K20 只有 13 个 SM,那么这个内核会如何表现?)

或者,也许您还有其他答案?

4

2 回答 2

5

每个 SM 使用的块数取决于以下内容。

  1. 每个 SM 的块数的硬限制。
  2. 每个块的线程数。
  3. 每个块的共享内存量。
  4. 每个块使用的寄存器数。

假设共享内存和寄存器不是限制因素,让我们看几个案例。

案例 1每个块 32 个线程和 64 个块。

只需查看线程数,您就可以得到 64 个块和 1 个 SM 的答案。但是每个 SM 有 16 个块的硬性限制。在这种情况下,(2)不是限制性约束,但(1)是。所以每个 SM 有 16 个块,使用了 4 个 SM。

案例 2每个块 1024 个线程和 32 个块。

在这种情况下,(2)是限制因素。每个 SM 只能有 2048 个线程,每个 SM 有 2 个块和使用 16 个 SM(显然会涉及一些块切换)。

案例 3每个块 1024 个线程,96 个块。如问题中所述

与上述类似,(2)是限制因素。每个 SM 只使用 2 个块。理论上需要48个SM 。在任何给定点只有 26 (13x2) 个块是“活动的”。CUDA 应该注意将不活动的块与需要处理的块进行切换。

TL;DR为您提供每个 SM 较少块数的约束是限制约束。

于 2013-06-17T23:08:42.193 回答
3

引用CUDA C 编程指南

对于给定内核,可以在多处理器上一起驻留和处理的块和扭曲的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。

每个多处理器也有最大数量的驻留块和驻留扭曲的最大数量。这些限制以及多处理器上可用的寄存器和共享内存的数量是设备计算能力的函数,并在附录 F 中给出。如果每个多处理器没有足够的寄存器或共享内存来处理至少一个块,内核将无法启动。

因此,您应该更好地讨论每个多处理器的最大块数,因为实际数量取决于所使用的寄存器和共享内存的数量,如指南所述。

对于您提到的情况,我会说内核将同时使用所有 SM,这些 SM 充其量将托管2每个块,因为卡上同时存在 26 个块。

我推荐以下参考:

Shane Cook,CUDA 编程,使用 GPU 进行并行计算的开发人员指南,第 5 章和第 9 章,策略 4,寄存器使用。

于 2013-06-17T20:18:15.230 回答