MIO 油门失速什么时候发生?

问题描述

根据此链接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) 和解耦数学。

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

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

解决方法

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

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

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

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