为什么cuda中的SM只执行一个扭曲?

为什么cuda中的SM只执行一个扭曲?,cuda,Cuda,我经常在一些CUDA材料中发现以下词语: “在任何时候,SM只执行一个扭曲” 在这里我不太明白,因为每个SM可以同时运行数百到数千个线程,为什么一个时间点只能执行一个warp,即32个线程 谢谢 不同代CUDA硬件的详细信息各不相同,但例如,在早期代中,每个SM有8个执行单元,每个执行单元执行4个线程(每个线程每4个周期执行一条指令)。因此,您可以得到4路SMT,它为每个SM提供32个并发线程 当然,每个GPU都有多个SMs,例如30,这意味着在任何给定时刻执行的30 x 32线程扭曲=960个

我经常在一些CUDA材料中发现以下词语:

“在任何时候,SM只执行一个扭曲”

在这里我不太明白,因为每个SM可以同时运行数百到数千个线程,为什么一个时间点只能执行一个warp,即32个线程


谢谢

不同代CUDA硬件的详细信息各不相同,但例如,在早期代中,每个SM有8个执行单元,每个执行单元执行4个线程(每个线程每4个周期执行一条指令)。因此,您可以得到4路SMT,它为每个SM提供32个并发线程


当然,每个GPU都有多个SMs,例如30,这意味着在任何给定时刻执行的30 x 32线程扭曲=960个线程。除此之外,还可以对扭曲进行切换,因此您可以拥有更多的线程,例如960个“活动”线程,即使在任何给定的时间只有960个线程在实际执行。

不同代的CUDA硬件的详细信息有所不同,但例如,在早期代中,每个SM有8个执行单元,每个执行单元执行4个线程(每个线程每4个周期发出一条指令)。因此,您可以得到4路SMT,每个SM提供32个并发线程


当然,每个GPU都有多条短消息,例如30条,这意味着在任何给定时刻执行的30 x 32线程扭曲=960个线程。除此之外,这些扭曲还可以进行切换,因此您可以拥有更多,例如960个“实时”线程,即使在任何给定的时间只有960个线程在实际执行。

对于特斯拉体系结构来说,这是正确的,但对于费米和开普勒来说,这是不正确的。从扭曲调度程序的角度来看SM更容易。在每个周期,扭曲调度程序都会选择一个合格的扭曲(一个未停止的扭曲)并将一个或两个指令从warp发送到执行单元。费米和开普勒白皮书中记录了每个SM的执行单元数。CUDA内核大致相当于可以执行整数和单精度浮点运算的执行单元数。加载/存储操作还有其他执行单元配给、分支等

计算能力1.x(特斯拉)

  • 每个SM 1个扭曲调度器
  • 每个warp调度程序调度1条指令
计算能力2.0(费米第一代)

  • 每个SM有2个warp调度程序
  • 每个warp调度程序调度1条指令
计算能力2.1(费米第二代)

  • 每个SM有2个warp调度程序
  • 每个warp调度程序调度1或2条指令
计算能力3.x(开普勒)

  • 每个SM 4个warp调度程序
  • 每个warp调度程序调度1或2条指令

该声明适用于特斯拉体系结构,但不适用于费米和开普勒。从扭曲调度程序的角度来看SM更容易。在每个周期,扭曲调度程序都会选择一个合格的扭曲(未停止的扭曲)并将一个或两个指令从warp发送到执行单元。费米和开普勒白皮书中记录了每个SM的执行单元数。CUDA内核大致相当于可以执行整数和单精度浮点运算的执行单元数。加载/存储操作还有其他执行单元配给、分支等

计算能力1.x(特斯拉)

  • 每个SM 1个扭曲调度器
  • 每个warp调度程序调度1条指令
计算能力2.0(费米第一代)

  • 每个SM有2个warp调度程序
  • 每个warp调度程序调度1条指令
计算能力2.1(费米第二代)

  • 每个SM有2个warp调度程序
  • 每个warp调度程序调度1或2条指令
计算能力3.x(开普勒)

  • 每个SM 4个warp调度程序
  • 每个warp调度程序调度1或2条指令

不同代GPU(GT200、费米、开普勒)的warp执行粒度看起来略有不同。本说明中有GT200。在费米中,每个SM有32个执行单元,因此同时执行一个扭曲。在开普勒中,每个SM有32个以上的执行单元,因此每个SMX(每个开普勒SM)可以同时执行多个扭曲(“在任何给定的时间/时间”).但在所有情况下,warp的定义都是32个线程以锁步方式执行。因此,如果一个块有32个以上的线程,则必须每32个线程将其顺序加载到同一个SM上,对吗?计划执行的块始终驻留在一个且仅驻留在一个SM上。一旦一个块开始在SM上执行,它将保留在那里。所有threa该块的ds(分组为扭曲)将在该SM上执行,直到该块完成并失效。由于SM的执行单元数量有限,因此扭曲可能会按顺序执行,或以某种随机顺序执行。当扭曲因任何原因(例如内存引用)暂停时SM可以从驻留在该SM上的块中自由安排另一个可用的扭曲。另请参见Greg Smith的回答。谢谢!但是现在如果同一块中的不同扭曲按顺序加载(或以随机顺序加载),那么“\uu syncThreads()”如何同步这些“顺序”扭曲?\uu syncThreads()是一个障碍。一旦任何扭曲击中该障碍,该扭曲将被暂停并移出执行,扭曲计划程序将选择另一个扭曲来取代它。如果该新扭曲来自同一个线程块,那么它可能在某个时候也会击中同步线程障碍,并将被换出另一个扭曲。Fol在这一过程中,螺纹块中的所有翘曲最终都会到达(并在)屏障。如果所有翘曲都在屏障处停止,则任何翘曲都可以