快速诊断GPU性能瓶颈

Tuesday, February 11, 2025

GPU性能瓶颈主要分为3类:Latency Bound, Math Bound, Memory Bound。

1 诊断步骤:

1.1 评估硬件参数

  • GPU SM数量,比如 A100~108, V100~80
  • GPU 算力-带宽比(ops:bytes)计算GPU算力(TFLOPS)和显存带宽的比值(TB/s),比如:A100(FP16)算力312 TFLOPS,带宽1.5TB/s,ops:bytes=208 FLOP/Byte

1.2 评估计算算法Arithmetic Intensity

  • 即算法每读取1Byte数据课执行的浮点操作数(FLOP/Byte)
  • 例子:矩阵乘法(GEMM)的Arithmetic Intensity一般较高,逐元素操作的算法(比如激活函数)一般较低
  • 后果:
    • GPU 算力不足以处理高计算密度任务(如大矩阵乘法),性能受限于 Tensor/CUDA Core;
    • 显存带宽不足以支持低计算密度任务(如小批量推理),性能受限于数据搬运速度。

1.3 评估并发是否充分

  • 条件1: Thread Block数量>=4xSM数量
  • 条件2: 每个Thread Block包括256~1024个Thread
  • 后果:SM 无法被充分占用,线程调度开销主导性能。

即:

                  ┌────────────────┐
                  │ 并行性是否充足? │
                  └──────┬─────────┘
           No ┌──────────┘ ┌──────────Yes
              ▼            ▼
      ┌─────────────┐  ┌─────────────────────┐
      │ 延迟瓶颈     │  │ 算术强度 > ops:bytes? │
      └─────────────┘  └──────┬──────────────┘
                      Yes ┌────┘ ┌────No
                          ▼      ▼
                   ┌──────────┐ ┌──────────┐
                   │ 计算瓶颈 │ │ 内存瓶颈 │
                   └──────────┘ └──────────┘

2 优化方向

Latency Bound

  • 目标:增加并行度
  • 方法:
    • increase Batch Size,或合并独立任务
    • 调整ThreadBlock大小,增加ThreadBlock数量

Math Bound

  • 目标:提升计算效率
  • 方法:
    • 调整矩阵维度,以启用Tensor Core(比如FP16对其8)
    • 调整Tile Size(分块策略)或者mix precision(混合精度)

Memory Bound

  • 目标:减小数据搬运量
  • 方法:
    • 优化访存模式(合并访存、共享内存访存)
    • 降低数据精度(FP16/BF16)或启用稀疏算法

样例:矩阵乘法

GPU

GPU性能-矩阵乘法

爱情万岁 蔡明亮