在 Nsight Compute 中解释计算工作负载分析

Interpreting compute workload analysis in Nsight Compute

计算工作负载分析显示不同计算管道的利用率。我知道在现代 GPU 中,整数和浮点流水线是不同的硬件单元,可以并行执行。但是,对于其他流水线来说,哪个流水线代表哪个硬件单元不是很清楚。我也找不到任何关于管道的缩写和解释的在线文档。

我的问题是:

1)ADU、CBU、TEX、XU的全称是什么?它们如何映射到硬件?

2) 哪些流水线使用相同的硬件单元(例如 FP16、FMA、FP64 使用浮点单元)?

3) 现代 GPU 中的 warp 调度程序每个周期可以调度 2 条指令(使用不同的管道)。哪些流水线可以同时使用(例如FMA-ALU、FMA-SFU、ALU-Tensor等)?

P.s.: 我正在为那些不熟悉 Nsight Compute 的人添加屏幕截图。

Volta (CC 7.0) 和 Turing (CC 7.5) SM 由 4 个子分区 (SMSP) 组成。每个子分区包含

  • warp 调度程序
  • 注册文件
  • 立即常量缓存
  • 执行单位
    • ALU、FMA、FP16、UDP (7.5+) 和 XU
    • 以计算为中心的部件 (GV100) 上的 FP64
    • 张量单位

包含其他几个分区,其中包含由 4 个子分区共享的执行单元和资源,其中包括

  • 指令缓存
  • 索引常量缓存
  • 分为标记 RAM 和共享内存的 L1 数据缓存
  • 执行单位
    • ADU, LSU, TEX
    • 在非计算部分,FP64 和 Tensor 可以实现为共享执行单元

在 Volta (CC7.0, 7.2) 和 Turing (CC7.5) 中,每个 SM 子分区每个周期可以发出 1 条指令。指令可以发给本地执行单元,也可以发给SM共享执行单元。

  • A​​DU - 地址发散单元。 ADU 负责 branches/jumps 的每个线程地址分歧处理,并在将指令转发到其他执行单元之前索引常量加载。
  • A​​LU - 算术逻辑单元。 ALU 负责执行大多数整数指令、位操作指令和逻辑指令。
  • CBU - 收敛屏障单元。 CBU 负责屏障、收敛和分支指令。
  • FMA - 浮点乘法和累加单元。 FMA 负责大多数 FP32 指令、整数乘法和累加指令以及整数点积。
  • FP16 - 成对的半精度浮点单元。 FP16 单元负责执行成对的半精度浮点指令。
  • FP64 - 双精度浮点单元。 FP64 单元负责所有 FP64 指令。 FP64 通常在 NVIDIA GPU 上实现为多个不同的管道。每个芯片的吞吐量差异很大。
  • LSU - 加载存储单元。 LSU 负责加载、存储和原子指令到全局、本地和共享内存。
  • Tensor (FP16) - 半精度浮点矩阵乘法和累加单元。
  • Tensor (INT) - 整数矩阵乘积单元。
  • TEX - 纹理单元。纹理单元负责纹理和表面的采样、加载和过滤指令。
  • UDP(统一)- 统一数据路径- 用于执行指令的标量单元,其中输入和输出对于 warp 中的所有线程都是相同的。
  • XU - 超越和数据类型转换单元 - XU 负责特殊功能,如 sin、cos 和倒数平方根以及数据类型转换。