了解流式多处理器 (SM) 和流式处理器 (SP)

use*_*695 6 cuda gpu

我试图了解 GPU 的基本架构。我已经阅读了很多材料,包括这个非常好的 SO 答案。但我仍然很困惑,无法得到一张好的照片。

我的理解:

  • 一个 GPU 包含两个或多个流式多处理器 (SM),具体取决于计算能力值。
  • 每个 SM 由流处理器 (SP) 组成,它们实际上负责指令的执行。
  • 每个块都由 SP 以扭曲(32 个线程)的形式处理。
  • 每个块都可以访问共享内存。不同的块无法访问其他块的共享内存的数据。

困惑:

在下图中,我无法理解哪个是流式多处理器 (SM),哪个是 SP。我认为Multiprocessor-1代表单个 SM,而Processor-1(最多 M)代表单个 SP。但我不确定这一点,因为我可以看到每个处理器(蓝色)都提供了一个寄存器,但据我所知,一个寄存器提供给线程单元。

如果你能提供一些关于这张图片或任何其他图片的基本概述,这对我会很有帮助。

图片

voi*_*ptr 6

首先,对问题的“我的理解”部分发表一些评论:

  • SM 的数量取决于 GPU 型号 - 低端型号只有一个 SM,而高端型号多达 30 个!计算能力定义了这些 SM 的能力,而不是一个 GPU 中有多少个 SM。
  • 每个线程块都分配给一个 SM,而不是 SP。可以有多个线程块在给定的 SM 上运行,受其资源限制的约束。

上图:

  • 橙色框确实是 SM,就像它们被标记一样。每个 SM 都有共享内存池,在这个 SM 上运行的所有线程块之间划分。
  • 蓝框是 SP。由于 SP 是标量通道,它运行一个线程,并且每个线程都提供有自己的一组寄存器,同样,如图所示。

解决后续问题:

  • 每个 SM 可以有多个常驻线程块。驻留在 SM 上的最大线程块数由计算能力决定。当受寄存器数量或每个线程块消耗的共享内存量限制时,实现数量可能低于最大值。
  • 然后 SM 将调度来自所有驻留在其上的经线的指令,在具有准备执行的指令的经线中挑选——这些经线可能来自驻留在该 SM 上的任何线程块。您通常希望有许多经线驻留,以便在任何给定时刻,SP 都可以忙于运行来自准备好的任何经线的指令。
  • 每个 SM 的核心数不是一个非常有用的指标,此时您无需过多考虑。