首页 > 解决方案 > CUDA 中的 Warp 和 block 调度——到底发生了什么,以及关于合格 warp 的问题

问题描述

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

标签: cuda

解决方案


块调度是否包括warp调度?

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

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

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

然而,究竟是什么让经线“符合条件”?

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

如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?

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

(*) 有一个称为“未选择”的“停顿原因”,实际上并不表示经纱已停顿。这意味着 warp 实际上是合格的,但它没有被选择用于该周期的指令调度,通常是因为 warp 调度程序选择了来自其他 warp 的指令,以在该周期中发出。


推荐阅读