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 memory–Bank 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 进行授权