这个问题源于在内核中观察到的理论占用率和实际占用率之间的差异。我知道计算器和 nvprof 之间的不同占用率,以及关于从块到 CUDA 中的 SM 分布的详细信息的问题。
让我们考虑一个计算能力 = 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。我认为最后一个块只有 512 个线程中的 256 个处于活动状态,才能到达数组的最后 256 个元素,并且它在第二个 SM 中分配。因此,考虑到经纱粒度,只有 8 个经纱处于活动状态。
选项 2.-将每个 512 块调度到不同的 SM。既然我们有 15 个 SM,为什么只有一个 SM 有很多块?在这种情况下,我们每个 SM 有 512 / 32 = 16 个活动经线(最后一个除外,它只有 256 个活动线程)。因此,我们在四个 SM 中实现了 0.25 的占用率,在最后一个 SM 中实现了 0.125,导致 (0.25 + 0.25 + 0.25 + 0.25 + 0.125) / 5 = 0.225。
选项 2 更接近视觉分析器报告的占用率,我们认为这是幕后发生的事情。无论如何,值得一问:当块数少于可用 SM 时,如何将块调度到 CUDA 中的 SM 中?是否记录在案?
-- 请注意,这不是家庭作业。这是使用不同第三方库的项目中的真实场景,这些库在由多个内核组成的管道的某些步骤中需要处理少量元素。