gpt4 book ai didi

cuda - 当 block 的数量少于可用的 SM 时,如何将它们调度到 CUDA 中的 SM 中?

转载 作者:行者123 更新时间:2023-12-03 17:16:41 32 4
gpt4 key购买 nike

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

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

如果我们将内核配置为 512 个线程,那么每个线程将处理一个元素,我们需要 5 个块来处理所有数据。并且内核非常小,因此在使用资源方面没有任何限制,无论是寄存器还是共享内存。

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

然而,达到的占用率(由 nvidia profiler 报告)为 ~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 的入住率,在最后一个中实现了 0.125,导致 (0.25 + 0.25 + 0.25 + 0.25 + 0.125)/5 = 0.225。

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

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

最佳答案

正如几年来针对这个问题发表的评论中所指出的,块调度程序的行为是未定义的,并且不能保证从硬件代到硬件代、从驱动程序/运行时版本到驱动程序/运行时版本,甚至是相同的平台到平台。

当然可以使用汇编器指令检测代码以提取时钟和 SM ID 并运行一些案例以查看设备上发生的情况。正如 Greg Smith 在评论中指出的那样,您可能会得出这样的结论:调度程序首先以广度工作,将 SM 填充到最大可用占用率,但不一定总是这样。最终,您尝试并利用您的发现构建的任何启发式方法都将依赖于未定义的行为。

[从评论中收集并添加为社区维基条目,以将问题从 CUDA 标签的未答复队列中删除]

关于cuda - 当 block 的数量少于可用的 SM 时,如何将它们调度到 CUDA 中的 SM 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43632483/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com