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)或启用稀疏算法