CUDA 中的 warp 和 block 调度——到底发生了什么,以及有关合格 warp 的问题
Warp and block scheduling in CUDA - what exactly happens, and questions about eligible warps
我了解在 CUDA 中如何安排 warp 和块 - 但不了解这两种安排安排是如何结合在一起的。我知道一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择符合条件的 warp 执行(如果备用执行资源允许)。然而,究竟是什么使经纱“符合条件”?如果有足够的执行资源来支持一个新的 warp——而不是一个新的块呢? block调度是否包括warp调度?非常感谢您的帮助,谢谢!
Does the block scheduling include warp scheduling?
块调度器和 warp 调度器应该被认为是两个独立的实体。事实上,我会将 block-scheduler 视为 device-wide 实体,而 warp 调度程序是 per-SM 实体。
您可以想象可能有一个与每个内核启动相关联的块“队列”。当 SM 上的资源可用时,块调度程序将从“队列”中存放一个块到该 SM。
根据该描述,块调度不包括 warp 调度。
However, what exactly makes a warp "eligible"?
我们现在正在考虑一个已经存放在 SM 上的块。当一个 warp 有一个或多个准备好执行的指令时,它是“合格的”。 “合格”的反义词是“停滞”。当没有准备好执行的指令时,warp 被“停滞”。 GPU profiler documentation 描述了多种可能的“停滞原因”(*),但典型的原因是 依赖关系:一条依赖于前一条指令结果的指令(或操作,例如内存读取)只有在前一个 instruction/operation 的结果准备就绪后才能发出。另请注意,GPU 目前不是 out-of-order 机器。如果要执行的下一条指令当前已停止,则 GPU 不会(很远地)在后续指令流中搜索可能的独立可执行指令。
And what if there are enough execution resources to support a new warp - but not a new block?
这没有提供任何有用的信息。为了调度一个新块(即块调度程序将一个新块存放在 SM 上)必须有足够的资源可用于整个块。 (块调度器不存放块 warp-by-warp。它是一个 all-or-nothing 命题,基于 block-by-block。)
(*) 有一个称为“未选择”的“停滞原因”,实际上并不表示经线停滞。这意味着 warp 实际上是合格的,但它没有被选择用于该周期的指令调度,通常是因为 warp 调度程序选择了来自其他 warp 的指令,以在该周期中发出。
我了解在 CUDA 中如何安排 warp 和块 - 但不了解这两种安排安排是如何结合在一起的。我知道一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择符合条件的 warp 执行(如果备用执行资源允许)。然而,究竟是什么使经纱“符合条件”?如果有足够的执行资源来支持一个新的 warp——而不是一个新的块呢? block调度是否包括warp调度?非常感谢您的帮助,谢谢!
Does the block scheduling include warp scheduling?
块调度器和 warp 调度器应该被认为是两个独立的实体。事实上,我会将 block-scheduler 视为 device-wide 实体,而 warp 调度程序是 per-SM 实体。
您可以想象可能有一个与每个内核启动相关联的块“队列”。当 SM 上的资源可用时,块调度程序将从“队列”中存放一个块到该 SM。
根据该描述,块调度不包括 warp 调度。
However, what exactly makes a warp "eligible"?
我们现在正在考虑一个已经存放在 SM 上的块。当一个 warp 有一个或多个准备好执行的指令时,它是“合格的”。 “合格”的反义词是“停滞”。当没有准备好执行的指令时,warp 被“停滞”。 GPU profiler documentation 描述了多种可能的“停滞原因”(*),但典型的原因是 依赖关系:一条依赖于前一条指令结果的指令(或操作,例如内存读取)只有在前一个 instruction/operation 的结果准备就绪后才能发出。另请注意,GPU 目前不是 out-of-order 机器。如果要执行的下一条指令当前已停止,则 GPU 不会(很远地)在后续指令流中搜索可能的独立可执行指令。
And what if there are enough execution resources to support a new warp - but not a new block?
这没有提供任何有用的信息。为了调度一个新块(即块调度程序将一个新块存放在 SM 上)必须有足够的资源可用于整个块。 (块调度器不存放块 warp-by-warp。它是一个 all-or-nothing 命题,基于 block-by-block。)
(*) 有一个称为“未选择”的“停滞原因”,实际上并不表示经线停滞。这意味着 warp 实际上是合格的,但它没有被选择用于该周期的指令调度,通常是因为 warp 调度程序选择了来自其他 warp 的指令,以在该周期中发出。