当CUDA的数量小于可用的SM时,如何将这些块安排到SM中?

时间:2017-04-26 11:09:12

标签: cuda profiling gpu nvidia nvprof

这个问题来自于在内核中观察到的理论和实现的占用率之间的差异。我知道different occupancy between calculator and nvprof以及A question about the details about the distribution from blocks to SMs in CUDA

考虑具有计算能力= 6.1和15个SM的GPU(GTX TITAN,Pascal架构,芯片组GP104)。让我们考虑一个2304元素的小问题。

如果我们配置一个包含512个线程的内核,那么每个线程将处理一个元素,我们需要5个块来操作所有数据。内核非常小,对资源的使用没有任何限制,包括寄存器或共享内存。

因此理论占用率为1,因为可以在一个SM(2048个线程)中分配四个并发块,从而导致2048/32 = 64个有效扭曲(最大值)。

然而,实现的占用率(由nvidia分析器报告)为~0.215,并且可能与块映射到SM的方式有关。那么,当它们的数量小于可用的SM时,块如何在CUDA中安排进入SM?

选项1 .- 将4个512个线程的块调度到一个SM中,将1个512个块的块调度到另一个SM中。在这种情况下,占用率将是(1 + 0.125)/ 2 = 0.56。我认为最后一个块只有256个512个线程处于活动状态,可以到达阵列的最后256个元素,并在第二个SM中分配。因此,考虑到经线粒度,只有8个经线处于活动状态。

选项2 .- 将512的每个块安排到不同的SM。由于我们有15个SM,为什么只有一个带有很多块的SM饱和?在这种情况下,我们每个SM有512/32 = 16个有效warp(除了最后一个,只有256个活动线程)。因此,我们在4个SM中实现了0.25个占用率,在最后一个SM中实现了0.125个占用率,导致(0.25 + 0.25 + 0.25 + 0.25 + 0.125)/ 5 = 0.225。

选项2更接近视觉分析器报告的占用率,我们认为是幕后发生的事情。无论如何,值得一提的是:当CUDA中的数量小于可用的SM时,如何将这些块安排到SM中?有记录吗?

- 请注意,这不是作业。这是一个项目中的真实场景,它使用不同的第三方库,在由多个内核组成的管道的某些步骤中处理少量元素。

1 个答案:

答案 0 :(得分:1)

正如多年来对此问题发表的评论所指出的那样,块调度程序的行为是不确定的,并且不能保证从硬件生成到硬件生成,驱动程序/运行时版本到驱动程序/运行时版本都相同。 ,甚至平台之间。

当然可以使用汇编程序指令来检测代码,以提取时钟和SM ID并运行某些情况以查看设备上会发生什么。正如格雷格·史密斯(Greg Smith)在评论中指出的那样,您可能会得出这样的结论,即调度程序首先工作在广度上,将SM填充到最大可用占用量,但是不一定总是那样。最终,您尝试利用发现进行尝试的任何启发式方法都将依赖于不确定的行为。

[由评论组装而成,并作为社区Wiki条目添加,以使问题从CUDA标签的未答复队列中消失]