哪些 GPU 执行依赖项具有固定延迟导致“等待”停顿?

问题描述

在最近的 NVIDIA 微架构中,出现了一种新的 (?) 扭曲停顿原因/扭曲调度程序状态分类法。其中之一is

Wait :Warp 已停止等待固定延迟执行依赖项。

作为@GregSmith explains,固定延迟指令是:“数学,按位[和]寄存器移动”。但什么是固定延迟的“执行依赖”?这些只是“在我们自己发布之前等待其他人的固定延迟指令结束”吗?

解决方法

执行依赖是在下一条指令发出之前需要解决的依赖。这些包括寄存器操作数和谓词。 WAIT 停顿原因将在具有固定延迟的指令之间发出。如果流水线发出频率不是每周期 1 个扭曲(例如,FMA 和 ALU 管道可以在 GV100 - GA100 上每隔一个周期发出一次),编译器可以选择在同一流水线的指令之间添加额外的等待。

示例 1 - 无依赖项 - 编译器添加等待

IADD  R0,R1,R2;  # R0 = R1 + R2
// stall = wait for 1 additional cycle
IADD  R4,R5,R6;  # R4 = R5 + R6
// stall = wait for 1 additional cycle
IADD  R8,R9,R10; # R8 = R9 + R10

如果编译器没有添加等待周期,那么停顿的原因就是 math_throttle。如果 warp 已准备好发出指令(所有依赖项已解决)并且另一个 warp 正在向目标管道发出指令,这也会显示出来。

示例 2 - 由于写后读依赖而导致等待停顿

IADD  R0,R2;  # R0 = R1 + R2
// stall - wait for fixed number of cycles to clear read after write
IADD  R0,R0,R3;  # R0 += R3
// stall - wait for fixed number of cycles to clear read after write
IADD  R0,R4;  # R0 += R4