15

注意:此问题特定于 nVIDIA Compute Capability 2.1 设备。以下信息来自 CUDA Programming Guide v4.1:

在计算能力 2.1 设备中,每个SM有 48 个SP(内核)用于整数和浮点运算。每个经线由 32 个连续的线组成。每个 SM 有 2 个warp 调度器。在每个指令发布时间,一个warp 调度程序选择一个准备好的线程warp,并为核心上的warp 发出2 条指令

我的疑惑:

  • 一个线程将在一个核心上执行。设备如何在单个时钟周期或单个多周期操作中向线程发出 2 条指令?
  • 这是否意味着这两条指令应该相互独立?
  • 这两条指令可以在内核上并行执行,可能是因为它们在内核中使用了不同的执行单元?这是否也意味着只有在 2 条指令执行完毕后,或者在其中一条指令之后,warp 才会准备就绪?
4

1 回答 1

24

这是指令级并行(ILP)。同时从warp发出的指令必须彼此独立。它们由 SM 指令调度器发出,用于分离 SM 中的功能单元。

例如,如果 warp 的指令流中有两条独立的 FMAD 指令准备发布,并且 SM 有两组可用的 FMAD 单元来发布它们,则它们都可以在同一个周期中发布。(指令可以多种组合一起发出,但我没有记住它们,所以我不会在这里提供细节。)

SM 2.1 中的 FMAD/IMAD 执行单元是 16 个 SP 宽。这意味着需要 2 个周期来向 16 个宽的执行单元之一发出 warp(32 线程)指令。每个 SM 有多个 (3) 个这 16 个范围的执行单元(总共 48 个 SP),外加特殊功能单元。每个 warp 调度程序可以在每个周期向其中两个发出。

假设 FMAD 执行单元pipe_Apipe_Bpipe_C。假设在第 135 个周期,有两条独立的 FMAD 指令fmad_1正在fmad_2等待:

  • 在周期 135,指令调度器将发出前半个 warp(16 个线程)fmad_1到 FMADpipe_A和前半个 warpfmad_2到 FMAD pipe_B
  • 在周期 136 处,前半个经线fmad_1将移至 FMAD 中的下一个阶段pipe_A,类似地,前半个经线fmad_2将移至 FMAD 中的下一个阶段pipe_B。现在,warp 调度程序将后半部分 warpfmad_1发送到 FMAD pipe_A,并将后半部分 warpfmad_2发送到 FMAD pipe_B

所以从同一个warp发出2条指令需要2个周期。但是正如 OP 提到的,有两个 warp 调度程序,这意味着整个过程可以同时完成,以获取来自另一个 warp 的指令(假设有足够的功能单元)。因此,最大发布率为每个周期 2 条 warp 指令。请注意,这是程序员视角的抽象视图——实际的低级架构细节可能不同。

至于您关于接下来何时准备好经线的问题,如果有更多指令不依赖于任何未完成的(已经发出但未退休)指令,那么它们可以在下一个周期中发出。但是一旦唯一可用的指令依赖于飞行中的指令,warp 将无法发出。然而,这就是其他 warp 进来的地方——SM 可以为任何具有可用(非阻塞)指令的驻留 warp 发出指令。扭曲之间的这种任意切换提供了 GPU 依赖于高吞吐量的“延迟隐藏”。

于 2012-03-27T10:03:33.613 回答