跳转至

优化访存受限的 kernel

上游 NVIDIA / H200 调优参考

本页保留自 tile-ai/TileOPs.github.io 的 NVIDIA 平台教程。所有实测数字、图表、硬件参数及 SM、warp、shared memory 等 规则均属于原文的 H200 / CUDA 语境,不是 Ascend 910B1 的结果或硬件说明。 保留这些案例用于理解调优方法;向 Ascend 移植时须重新验证硬件规则与性能。 本 fork 的 Ascend 测量方法见计时方法。

什么是访存受限

在 GPU 上,一个 kernel 跑多快,取决于算力与带宽哪一个先成为瓶颈。TileOPs 用 macro benchmark 测算出一个校准系数:硬件 spec 给出的理论峰值乘以校准系数,得到实际可达的有效值,以此作为性能优化的指导标准。上游在 H200 上实测出 fp32 FMA 的算力为 57.27 TFLOP/s,访存带宽为 4.07 TB/s。roofline 的拐点(ridge point)是带宽斜线与算力上限这两段的交点,两者相除给出它的横坐标,也就是拐点处的算术强度 14.07 flop/byte —— 算力与带宽同时用满时,每搬运一个字节对应的浮点运算次数:

1 2 4 8 16 32 64 1 2 4 8 16 32 64 可达算力 TFLOP/s(对数轴) 算术强度:每字节的浮点运算数(对数轴) 拐点 每字节 14 次 silu (fp16) 5 次 / 4 字节,上限 5.1 带宽上限 4.07 TB/s 算力上限 57.3 TFLOP/s

图上这条折线就是 roofline,任何 kernel 的性能点都落在它以下。拐点以左,上限是「算术强度 × 带宽」,可达算力随算术强度线性上升;拐点以右,上限就是算力峰值,不再随算术强度变化。silu 每搬运 4 个字节做 5 次运算,算术强度 1.25 flop/byte,只有拐点的 1/11,所以即便带宽完全用满,也只能达到算力上限的 9%。
  1. 优化 global memory 访问
  2. 优化 shared memory 访问