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

问题描述

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

解决方法

块调度包括翘曲调度吗?

应该将块调度程序和扭曲调度程序视为2个单独的实体。实际上,我会将块调度程序视为设备范围的实体,而warp调度程序则是针对每个SM的实体。

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

根据该说明,块调度不包括翘曲调度。

但是,究竟是什么使翘曲“合格”呢?

我们现在正在考虑已存储在SM上的块。当翘曲具有准备执行的一条或多条指令时,它是“合格的”。 “合格”的对立面是“停滞不前”。当翘曲没有准备好执行的指令时,它将“停滞”。 GPU profiler documentation描述了各种可能的“失速原因”(*),但典型的将是 dependency :取决于前一条指令(或操作)结果的一条指令,例如内存读取)在上一条指令/操作的结果准备就绪之前是不合格的。另请注意,GPU当前不是乱序机器。如果当前要执行的下一条指令处于暂停状态,则GPU不会(很远)在后续指令流中搜索可能的独立可执行指令。

如果有足够的执行资源来支持新的扭曲(而不是新的块)怎么办?

那没有提供任何有用的信息。为了调度新块(即,用于块调度器将新块存储在SM上),必须有足够的资源可用于整个块。 (块调度程序不会逐个逐个存储块。它是逐个块的全有或全无的提议。)

(*)有一个“失速原因”称为“未选中”,它实际上并不表示经线已失速。这意味着warp实际上是合格的,但是没有选择该循环作为该周期的指令分发,通常是因为warp调度程序从其他warp中选择了要在该循环中发布的指令。>