MIO 油门失速何时发生?

rm9*_*m95 7 cuda gpu nvidia nsight-compute

根据此链接https://docs.nvidia.com/nsight-compute/ProfilingGuide/index.html

Warp 因等待 MIO(内存输入/输出)指令队列未满而停止。在 MIO 管道(包括特殊数学指令、动态分支以及共享内存指令)的极端利用率的情况下,这种停顿原因很严重。

根据此https://docs.nvidia.com/drive/drive_os_5.1.12.0L/nsight-graphics/activities/index.html

可能由本地、全局、共享、属性、IPA、索引常量负载 (LDC) 和解耦数学触发。

我的理解是所有内存操作都是在LSU上执行的,所以我会想象它们一起存储在同一个指令队列中,然后由LSU单元执行。由于它们都一起排队,因此第二种解释(包括全局内存访问)对我来说更有意义。问题是,如果是这样的话,LG Throttle 就没有必要了。

MIO Throttle 实际上意味着什么?所有内存指令都存储在同一个队列中吗?

Gre*_*ith 6

MIO 是 NVIDIA SM 中的一个分区(从 Maxwell 开始),包含在 4 个 warp 调度程序或较慢的数学执行单元(例如 XU 管道)之间共享的执行单元。

发布到这些执行单元的指令首先被发布到指令队列中,允许warp调度器继续从warp发布独立的指令。如果 warp 的下一条指令指向已满的指令队列,则 warp 将停止,直到队列未满且指令可以入队。当发生这种停顿时,warp 将根据指令队列类型报告限制原因。指令队列到管道的映射因芯片而异。这是一般映射。

  • mio_throttle(ADU、CBU、LSU、XU)
  • lg_油门 (LSU)
    • 如果 MIO 指令队列达到本地/全局指令的水位线,则使用 lg_throttle。尽早限制本地/全局指令允许 SM 在由于本地/全局 L1 未命中而导致 L1 背压时继续发出共享内存指令。
  • tex_throttle(非 *100 芯片上的 TEX、FP64,TU11x 上的 Tensor)

如果 warp 发出的下一条指令是针对子分区特定执行单元(FMA、ALU、Tensor、FP64(*100 GPU)),则停顿原因是 math_throttle。