这是指令级并行(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_A
是pipe_B
和pipe_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 依赖于高吞吐量的“延迟隐藏”。