为什么在CUDA中只有一个warp被一个SM执行?

3
我经常在一些CUDA材料中看到以下词语:
“在任何时候,只有一个warp被SM执行。”
这里我不太理解,因为每个SM可以同时运行数百到数千个线程,为什么一次只能执行一个包含32个线程的warp呢?
谢谢!
2个回答

4
不同 CUDA 硬件的细节各有不同,但是例如在早期的一些版本中,每个 SM 有 8 个执行单元,每个执行单元会执行 4 个线程(每 4 个周期中的每个线程的一个指令)。因此,您可以获得 4 路 SMT,每个 SM 同时运行 32 个并发线程。
当然,每个 GPU 中可以有多个 SM,例如 30 个,这意味着每时每刻都会有 30 x 32 个线程簇 = 960 个线程在执行。除此之外,线程簇可以进行切换,因此您可以拥有比如说 960 个“活跃”线程更多的线程数量,即使在任何给定时间只有其中的 960 个线程实际执行。

6
不同一代的 GPU(GT200、Fermi、Kepler) warp 执行的粒度略有不同。本描述是以 GT200 为例。在 Fermi 中,每个 SM 有 32 个执行单元,所以一个 warp 同时执行。在 Kepler 中,每个 SM 有超过 32 个执行单元,因此在每个 SMX(每个 Kepler SM)上可以同时执行多个 warp,在任何给定的时间内。但在所有情况下,warp 的定义都是 32 个线程同时执行。 - Robert Crovella
那么,如果一个块有超过32个线程,它必须在同一个SM上按顺序加载每32个线程,对吧? - Hailiang Zhang
1
一个已经被调度执行的块总是驻留在一个且仅一个SM上。一旦一个块开始在SM上执行,它就会一直保持在那里。该块的所有线程(分组为warp)将在该SM上执行,直到该块完成并退役。由于SM具有有限数量的执行单元,可能会出现warp按顺序或以某种随机顺序执行的情况。当warp由于任何原因(例如内存引用)而停滞时,SM可以从驻留在该SM上的块中调度另一个可用的warp。另请参见Greg Smith的答案。 - Robert Crovella
谢谢!但是现在,如果来自同一块的不同线程组按顺序(或随机顺序)加载,那么“__syncThreads()”如何同步这些“顺序”线程组呢? - Hailiang Zhang
2
__syncThreads()是一个屏障。一旦任何warp到达该屏障,该warp将被阻塞并移出执行,另一个warp将由warp调度程序选择来取代它。如果新的warp来自同一线程块,则可能也会在某个时刻到达syncThreads屏障,并被另一个warp替换。按照这个过程,最终线程块中的所有warp都将到达(并停留在)屏障处。一旦所有warp都在屏障处停顿,那么任何一个warp都可以超越屏障。 - Robert Crovella
我认为Paul的意思是每个核心有4条通道(线程),而不是执行单元(可能会与ALU混淆)。 - G Gill

3
该论述对于Tesla架构是正确的,但对于Fermi和Kepler则是不正确的。从warp调度器的角度来看,更容易理解SM。在每个周期中,warp调度器选择一个合适的warp(一个没有停顿的warp),并将一个或两个指令从warp分派到执行单元。每个SM的执行单元数量在Fermi和Kepler白皮书中有记录。CUDA核心大致相当于可以执行整数和单精度浮点运算的执行单元数量。还有其他用于加载/存储操作、分支等的执行单元。 计算能力1.x(Tesla)
  • 每个SM有1个warp调度器
  • 每个warp调度器分派1个指令
计算能力2.0(Fermi第一代)
  • 每个SM有2个warp调度器
  • 每个warp调度器分派1个指令
计算能力2.1(Fermi第二代)
  • 每个SM有2个warp调度器
  • 每个warp调度器分派1或2个指令
计算能力3.x(Kepler)
  • 每个SM有4个warp调度器
  • 每个warp调度器分派1或2个指令

由于包装中的所有线程一次执行一个指令,那么包装调度程序如何可能分派2个指令呢? - haccks
只要这两个指令是独立的并且使用不同的执行单元,那么warp调度程序就可以将2个指令分派给同一个warp。这是非常普遍的。根据代数不同,Intel i7每个核心每个周期可以发出5-7条指令。有关更多信息,请参见超标量CPU架构上的此链接。 - Greg Smith
但是,一个wrap中的所有线程一次只执行一条指令,因此将两个独立的指令分派给同一个wrap是没有意义的。 - haccks
指令在每个周期以warp级别进行调度。SM2.1及以上的warp调度器可以在每个周期为所选warp分派最多2条独立指令。这一点在Kepler和Maxwell白皮书中有说明,而Kepler和Maxwell的指令配对应该显示在CUDA 7.5分析器中。 - Greg Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接