文章

CUDA性能概述:影响因素及优化方法

CUDA性能概述:影响因素及优化方法

性能分析依据Roofline 模型,该模型根据算术强度AI)划分两种性能区间(以A100为例):

  • 内存受限(Memory-bound):当AI低于13 FLOPs/Byte时,性能由内存带宽决定。
  • 计算受限(Compute-bound):当AI高于13 FLOPs/Byte时,性能由计算能力决定。

1. 性能影响及优化分类

1. 内存优化

  • global memory – 数据重用:例如将大块内存数据加载到shared memory,以减少对global memory的访问次数,从而提高AI
  • shared memoryBank Conflicts:比如矩阵计算C = A * B中的共享内存访问冲突,将B矩阵加载到shared memory之后,进行转置,避免Bank Conflicts

提升global memory带宽利用率。由于warp访问global memory时,是以128字节(32x4字节)为单位进行对齐访问,若warp内线程访问的地址不连续或未对齐,会导致多次transaction,从而降低带宽利用率。建议确保warp内线程访问的地址连续且对齐,以实现单次transaction访问完整的128字节数据。参考:https://www.olcf.ornl.gov/wp-content/uploads/2020/04/04-CUDA-Fundamental-Optimization-Part-2.pdf

带宽利用率有关的另一个概念是全局内存合并访问Global memory coalescing)。即warp内线程访问的地址应连续且对齐,以实现单次transaction访问完整的128字节数据,从而提升带宽利用率。线程内避免跨步长访问。细节参考:https://cseweb.ucsd.edu/classes/wi12/cse260-a/Lectures/Lec09.pdf

2. 指令延迟优化

  • 线程块并发(Occupancy)与延迟隐藏:合理配置共享内存和寄存器使用量,使SM可同时调度多个线程块,提高Warp的调度选择范围,从而隐藏内存访问延迟。
  • 线程分叉(Thread Divergence):Warp中线程执行路径不一致会导致序列化执行,降低吞吐率,建议使用分支无关的代码(如min/max替代if-else)以避免分歧。另外,如果数据分块不能完全分配到32个线程,可使用C+=A*0替代多余的条件分支。

3. CPU-GPU 交互优化

  • 使用Stream实现计算与数据传输重叠(Overlap):使用Stream+异步传输+异步启动kernel
  • 并发启动多个kernel
  • 传输大块内存。
  • pinned memory:固定分配出一块内存给CPU/GPU交互使用,禁用内存页管理不会被换出。此时GPU驱动可以直接使用DMA,传输速度接近理论值。

2. 参考资料

本文由作者按照 CC BY 4.0 进行授权