0

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

等待:Warp 因等待固定延迟执行依赖而停止。

正如@GregSmith解释的那样,固定延迟指令是:“数学,按位[和] 寄存器移动”。但是什么是固定延迟的“执行依赖”?这些只是“等待别人的固定延迟指令结束,然后我们才能自己发出”?

4

1 回答 1

1

执行依赖关系是在发出下一条指令之前需要解决的依赖关系。这些包括寄存器操作数和谓词。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, R1, 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, R0, R4;  # R0 += R4
于 2021-03-19T15:08:43.270 回答