在 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共享执行单元。
- ADU - 地址发散单元。 ADU 负责 branches/jumps 的每个线程地址分歧处理,并在将指令转发到其他执行单元之前索引常量加载。
- ALU - 算术逻辑单元。 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 和倒数平方根以及数据类型转换。
计算工作负载分析显示不同计算管道的利用率。我知道在现代 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共享执行单元。
- ADU - 地址发散单元。 ADU 负责 branches/jumps 的每个线程地址分歧处理,并在将指令转发到其他执行单元之前索引常量加载。
- ALU - 算术逻辑单元。 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 和倒数平方根以及数据类型转换。