每个多处理器的最大驻留线程数 VS. 每个多处理器的最大驻留块数

4
我在我的K20上遇到了关于并发内核执行资源的问题。我的流只有一点重叠,然后我认为这可能是由于资源限制造成的。所以我查阅了手册,并发现以下信息:每个多处理器的最大常驻块数为16,每个多处理器的最大常驻线程数为2048。
我的问题是:如果我有一个包含96个块,每个块中有1024个线程的内核。这个内核会同时使用多少个SM?
答案1:96/16 = 6
答案2:1024/2048*96 = 48(K20仅有13个SM,那么这个内核会如何表现?)
或者您可能有另一个答案?
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个线程,留下2个块。使用16个SM(显然会涉及一些块切换)。 情况3 每个块1024个线程,96个块。
类似于上述,(2)是限制因素。您每个SM只使用2个块。理论上需要48个SM。任何给定时间点只有26(13x2)个块处于“活动”状态。CUDA应处理将不活动的块与需要处理的块进行切换。 TL;DR 给出每个SM较少块数的约束条件是限制性因素。

3

引用CUDA C编程指南中的话:

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

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

因此,你最好谈论每个多处理器的最大块数,因为实际数量取决于内核使用的寄存器和共享内存的数量,正如指南所说。

对于你提到的情况,我会说内核将同时使用所有SM,最多每个SM将承载2个块,从而使卡上同时驻留26个块。

我推荐以下参考资料:

Shane Cook,《CUDA编程:面向GPU的并行计算开发者指南》第5章和第9章,策略4,寄存器使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接