0

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

论文说:不规则的工作项导致整个warp处于空闲状态(例如,下图中的warp0 wrt warp1)。

在此处输入图像描述

4

1 回答 1

2

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 可以执行指令。

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

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

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

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

于 2018-03-01T04:01:39.523 回答