如何让一个 warp 导致另一个 warp 处于 Idle 状态?

How to a warp cause another warp be in the Idle state?

正如您在问题标题中看到的那样,我想知道一个扭曲如何导致另一个扭曲进入 空闲 状态。我在 SO 中阅读了很多 Q/A 但我找不到答案。在任何时候,一个块中只有一个扭曲可以 运行?如果是这样,warp 的空闲状态就没有意义,但如果我们可以同时 运行 多个 warp,则每个 warp 都可以分别为其他 warp 做自己的工作。

论文说:不规则的work-items导致整个warp处于空闲状态(例如warp0w.r.t.warp1如下图)。

Nsight VSE 分析器用于扭曲状态的术语在 http://docs.nvidia.com/gameworks/index.html#developertools/desktop/nsight/analysis/report/cudaexperiments/kernellevel/issueefficiency.htm 中定义。这些术语也用于许多关于性能分析的 GTC 演示文稿。

当线程块的所有资源都可用时,计算工作分发器 (CWD) 将在 SM 上启动线程块。资源包括:

  • 线程块插槽
  • 传送槽(足够方块使用)
  • 为每个扭曲注册
  • 块的共享内存
  • 块的障碍

当 SM 有足够的资源时,线程块将在 SM 上启动。线程块被光栅化为扭曲。经线被分配给经线调度器。资源分配给每个经线。此时 warp 处于活动状态,这意味着 warp 可以执行指令。

在每个周期中,每个 warp 调度程序从符合条件的 warp 列表中选择(活动的,未停止的)并为 warp 发出 1-2 条指令。由于多种原因,经纱可能会停滞。请参阅上面的文档。

Kepler - Volta GPU(GP100 除外)每个流式多处理器 (SM) 有 4 个 warp 调度程序(子分区)。一个线程块的所有 warp 必须在同一个 SM 上。因此,在每个给定的周期上,线程块可以为线程块中最多 4 个(子分区)warp 发出指令。

每个 warp 调度程序可以在每个周期中选择任何符合条件的 warp。 SM 是流水线式的,因此最大尺寸线程块(1024 个线程 == 32 个线程束)的所有线程束在每个周期都可以有运行中的指令。

我可以在没有额外上下文的情况下确定的唯一空闲定义是: - 如果一个 warp 调度程序有 2 个符合条件的 warp 并且 1 个被选中,那么另一个被停滞在称为未选中的状态。 - 如果线程块中的 warp 执行屏障 (__syncthreads),则 warp 将在屏障上停止(不符合条件),直到满足屏障的要求。曲速停滞在屏障上。