CUDA性能概述:影响因素及优化方法
CUDA性能概述:影响因素及优化方法
性能分析依据Roofline 模型,该模型根据算术强度(AI)划分两种性能区间(以A100为例):
- 内存受限(Memory-bound):当
AI低于13 FLOPs/Byte时,性能由内存带宽决定。 - 计算受限(Compute-bound):当
AI高于13 FLOPs/Byte时,性能由计算能力决定。
1. 性能影响及优化分类
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。
1.2. 指令延迟优化
- 线程块并发(
Occupancy)与延迟隐藏:合理配置共享内存和寄存器使用量,使SM可同时调度多个线程块,提高Warp的调度选择范围,从而隐藏内存访问延迟。 - 线程分叉(
Thread Divergence):Warp中线程执行路径不一致会导致序列化执行,降低吞吐率,建议使用分支无关的代码(如min/max替代if-else)以避免分歧。另外,如果数据分块不能完全分配到32个线程,可使用C+=A*0替代多余的条件分支。
1.3. CPU-GPU 交互优化
- 使用
Stream实现计算与数据传输重叠(Overlap):使用Stream+异步传输+异步启动kernel。 - 并发启动多个
kernel。 - 传输大块内存。
pinned memory:固定分配出一块内存给CPU/GPU交互使用,禁用内存页管理不会被换出。此时GPU驱动可以直接使用DMA,传输速度接近理论值。
2. 参考资料
- Introduction to CUDA Performance Optimization:认真看,全面介绍CUDA性能优化,以及以及性能参数计算。
- NVIDIA – Fundamental Optimizations in CUDA:pdf文档。
3. CUDA、CuTe 及其他资料收集
- CUTLASS: Fast Linear Algebra in CUDA C++。强烈推荐,内容对应 GTC2018;详细讲解了在 cutlass 背景下针对 GEMM 优化的分块、内外积转换、缓存,以及相关基础概念和分层设计。
- GEMM优化博客。强烈推荐,结合性能指标分析从一个最原始的 GEMM 开始优化,注重性能分析
- nv blog 2025 cutlass。强烈推荐,内容对应 GTC 2023,介绍 cute,结合官方文档的 CuTe系列 理解 Layout 设计抽象。
- nv 2025 blog cutlass 3 介绍。 3.x 系列引入的特性和抽象分层,对应 GTC 2023,是上文的补充第二部分。
- GTC 2018:CUTLASS: Software Primitives for Dense Linear Algebra at All Levels and Scales within CUDA。初次介绍CUTLASS的GTC视频。
- GTC 2019:PROGRAMMING TENSOR CORES: NATIVE VOLTA TENSOR CORES WITH CUTLASS。Volta、Turing架构下的cutlass优化。
- GTC 2021:Accelerating Convolution with Tensor Cores in CUTLASS。卷积支持。
- GTC 2023:Developing Optimal CUDA Kernels on Hopper Tensor Cores。cutlass 3.x 引入 cute 抽象
- GTC 2024:CUTLASS: A Performant, Flexible, and Portable Way to Target Hopper Tensor Cores。卷积支持、epilog tree
- GTC 2025:Programming Blackwell Tensor Cores with CUTLASS。TBC,blackwell 特性。
- The Present and Future of CUTLASS Tensor Core Programming
3.1. 其他博客
本文由作者按照 CC BY 4.0 进行授权