CUDA 中的扭曲和块调度 - 到底发生了什么,以及有关合格扭曲的问题

cat*_*ood 2 cuda

我了解 CUDA 中的扭曲和块是如何调度的 - 但不知道这两种调度安排是如何结合在一起的。我知道,一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择执行符合条件的扭曲(如果备用执行资源允许)。然而,到底是什么让扭曲“合格”呢?如果有足够的执行资源来支持新的扭曲,但不能支持新的块,该怎么办?块调度是否包括warp调度?非常感谢您的帮助,谢谢!

Rob*_*lla 9

块调度是否包括warp调度?

块调度器和扭曲调度器应该被视为两个独立的实体。事实上,我将块调度程序视为设备范围的实体,而扭曲调度程序是每个 SM 的实体。

您可以想象可能有一个与每个内核启动相关的块“队列”。当 SM 上的资源变得可用时,块调度器会将“队列”中的块存入该 SM 上。

根据该描述,块调度不包括扭曲调度。

然而,到底是什么让扭曲“合格”呢?

我们现在正在考虑一个已经存入 SM 的区块。当扭曲具有一条或多条准备好执行的指令时,它是“合格的”。“合格”的反义词是“停滞”。当扭曲没有准备好执行的指令时,它就会“停滞”。GPU分析器文档描述了各种可能的“停顿原因”(*),但典型的原因是依赖关系:依赖于前一条指令(或操作,例如内存读取)结果的指令不符合条件直到前一条指令/操作的结果准备好为止。另请注意,GPU 目前并不是一台乱序机器。如果要执行的下一个指令当前被停止,GPU 不会(很远)搜索后续指令流以查找可能的独立可执行指令。

如果有足够的执行资源来支持新的扭曲,但不能支持新的块,该怎么办?

这并没有提供任何有用的东西。为了调度新块(即,块调度器将新块存放在SM上),必须有足够的资源可用于整个块。(块调度程序不会逐个块地存储块。这是一个全有或全无的命题,以块为基础。)

(*) 有一个名为“未选择”的“停顿原因”,它实际上并不表示扭曲已停顿。这意味着扭曲实际上是合格的,但没有选择它在该周期上进行指令调度,通常是因为扭曲调度程序从其他扭曲中选择了指令,以在该周期中发出。