【发布时间】:2020-10-31 17:51:48
【问题描述】:
我了解在 CUDA 中如何调度 warp 和块 - 但不了解这两种调度安排如何结合在一起。我知道一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择执行合格的扭曲(如果备用执行资源允许的话)。然而,究竟是什么让经线“符合条件”?如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?块调度是否包括warp调度?非常感谢您的帮助,谢谢!
【问题讨论】:
标签: cuda
我了解在 CUDA 中如何调度 warp 和块 - 但不了解这两种调度安排如何结合在一起。我知道一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择执行合格的扭曲(如果备用执行资源允许的话)。然而,究竟是什么让经线“符合条件”?如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?块调度是否包括warp调度?非常感谢您的帮助,谢谢!
【问题讨论】:
标签: cuda
block调度是否包含warp调度?
块调度器和warp调度器应该被认为是两个独立的实体。事实上,我会将块调度程序视为设备范围的实体,而 warp 调度程序是每个 SM 实体。
您可以想象每次内核启动都可能有一个块“队列”。当 SM 上的资源变得可用时,块调度器会将“队列”中的块存入该 SM。
根据该描述,块调度不包括warp调度。
但是,究竟是什么让经线“符合条件”?
我们现在正在考虑一个已经存放在 SM 上的区块。当一个 warp 有一个或多个准备好执行的指令时,它是“合格的”。 “合格”的反义词是“停滞不前”。当没有准备好执行的指令时,warp 被“停止”。 GPU profiler documentation 描述了各种可能的“停顿原因”(*),但典型的原因是 依赖:依赖于前一条指令(或操作,例如作为内存读取)在前一个指令/操作的结果准备好之前没有资格发出。另请注意,GPU 目前不是乱序机器。如果当前要执行的下一条指令被停止,GPU 不会(很远)在后续指令流中搜索可能的独立可执行指令。
如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?
这并没有提供任何有用的东西。为了调度一个新块(即让块调度程序在 SM 上存放一个新块),必须有足够的资源可供整个块使用。 (区块调度器不会逐个地存入区块。这是一个全有或全无的命题,以逐个区块为基础。)
(*) 有一个“停顿原因”称为“未选中”,这实际上并不表示经线已停顿。这意味着 warp 实际上是合格的,但它没有被选择用于该周期的指令调度,通常是因为 warp 调度程序选择了来自其他 warp 的指令,以在该周期中发出。
【讨论】: