我在K20上运行了一个关于并发内核执行资源的问题。我的流只有一点重叠然后我认为这可能是因为资源有限。所以我参考了手册,我发现:每个多处理器的最大驻留块数是16,每个多处理器的最大驻留线程数是2048.
所以我的问题是:如果我在每个块中有一个包含1024个线程的96个块的内核。这个内核并行使用多少个SM?
答案1:96/16 = 6
答案2:1024/2048 * 96 = 48(K20只有13个SM,那么这个内核的行为如何?)
或许你有另一个答案?
答案 0 :(得分:3)
在给定内核的多处理器上可以驻留和一起处理的块和warp的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。
每个多处理器还有最大驻留块数和最大驻留warp数。这些限制以及多处理器上可用的寄存器和共享存储器的数量是设备计算能力的函数,并在附录F中给出。如果每个多处理器没有足够的寄存器或共享存储器来处理至少一个块,内核将无法启动。
因此,您应该更好地讨论每个多处理器的最大块数,因为实际数量取决于寄存器和共享内存的使用量,如指南所示。
对于你提到的情况,我会说内核会同时使用所有的SM,它们最多只能托管2
个块,同时驻留在卡上的26个块。< / p>
我推荐以下参考:
Shane Cook, CUDA编程,开发人员使用GPU并行计算指南,第5章和第9章,策略4,注册用法。
答案 1 :(得分:3)
每个SM使用的数字块取决于以下内容。
假设共享内存和寄存器不是限制因素,那么让我们看一下几种情况。
案例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提供更少的块数是限制约束。