【问题标题】:Which GPU execution dependencies have fixed latency (causing 'Wait' stalls)?哪些 GPU 执行依赖项具有固定延迟(导致“等待”停顿)?
【发布时间】:2021-06-11 23:37:27
【问题描述】:

在最近的 NVIDIA 微架构中,有一种新的 (?) warp 停止原因/warp 调度程序状态分类法。其中之一is

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

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

【问题讨论】:

  • @RobertCrovella:就指令的分类而言,是的。但是“FOO 执行依赖”只是“等待执行 FOO 类型的指令”吗?如果是这样,我会作为一个骗子关闭它。
  • @RobertCrovella:啊,好的。然后查看编辑。
  • 执行依赖是下一条指令的输入,包括寄存器操作数和谓词。如果你有一个 IADD 操作链 IADD r0, r1, r2; IADD r4、r0、r3。第二条指令是 r4 = r0 + r3。 r0 是第一个 IADD 的输出。在这种情况下,扭曲会停止,直到第一条指令完成。由于 IADD 是固定延迟指令,编译器可以说明调度程序在发出第一个 IADD 和第二个 IADD 之间必须等待的最小周期。在这些周期中,扭曲因“等待”原因而停止。
  • @GregSmith:这听起来像是一个答案......

标签: cuda profiling latency nsight-compute


【解决方案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

【讨论】:

  • 1. “编译器可以选择” - 为什么这里涉及编译器?而且,在您的示例中-如果没有“等待”指令,只有 cmets,编译器以什么方式添加等待? 2.“在具有固定延迟的指令之间” - 所以,不是在一条具有固定延迟的指令和另一条具有可变延迟的指令之间,比如说,在它之前?
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2012-02-12
相关资源
最近更新 更多