跳转至

优化访存受限的 kernel

什么是访存受限

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

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

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