学习路径
本文档提供从零开始学习 CUDA GEMM 优化的 4 周学习计划,配套每日任务和练习题。
学习目标
完成本学习路径后,你将能够:
- 理解 GPU 架构和 CUDA 编程模型
- 掌握 7 级 GEMM 优化技术
- 能够分析和优化 CUDA kernel 性能
- 具备阅读 CUTLASS、cuBLAS 等生产级代码的能力
Week 1: CUDA 基础
Day 1-2: 环境搭建与 CUDA 编程模型
学习内容:
- CUDA Toolkit 安装和环境配置
- CUDA 编程模型:host、device、kernel
- 线程层次结构:grid、block、thread
- 内存层次结构:global、shared、register、local
实践任务:
bash
# 验证 CUDA 环境
nvcc --version
nvidia-smi
# 构建项目
cmake --preset default
cmake --build --preset default阅读代码:
src/naive_matmul.cu- 最基础的 CUDA kernelinclude/common.h- CUDA 错误处理宏
练习题:
- 修改
naive_matmul.cu,让每个线程计算 2 个输出元素,观察性能变化 - 使用
cudaGetDeviceProperties查询你的 GPU 的线程块和线程束参数
Day 3-4: 内存层次结构
学习内容:
- 全局内存的延迟和吞吐量
- 共享内存的使用和 bank conflict
- 寄存器的使用和溢出
阅读代码:
src/tiled_gemm.cu- 共享内存分块src/coalesced_gemm.cu- 合并访存
练习题:
- 在
tiled_gemm.cu中修改BLOCK_SIZE,观察性能如何变化 - 使用 Nsight Compute 分析 bank conflict
Day 5-7: Level 1-2 优化实践
学习内容:
- Naive GEMM 的性能瓶颈分析
- Tiled GEMM 的优化原理
- 性能测量方法
实践任务:
bash
# 运行 benchmark
./build-release/benchmark --kernel=naive --kernel=tiled练习题:
- 计算 Naive GEMM 的理论内存吞吐量,与实测值对比
- 分析 Tiled GEMM 相比 Naive 减少了多少全局内存访问
Week 2: 中级优化
Day 1-2: 合并访存优化
学习内容:
- 合并访存的原理
- 内存事务和对齐
- bank conflict 的避免
阅读代码:
src/coalesced_gemm.cu
练习题:
- 使用 Nsight Compute 分析
coalesced_gemm.cu的内存吞吐量 - 尝试修改线程块维度,观察对合并访存的影响
Day 3-4: 双缓冲优化
学习内容:
- 计算与内存访问的重叠
- 双缓冲技术
- 流水线并行
阅读代码:
src/double_buffer_gemm.cu
练习题:
- 分析双缓冲如何隐藏内存延迟
- 测量不同矩阵规模下双缓冲的收益
Day 5-7: Level 3-4 优化实践
实践任务:
bash
# 对比性能
./build-release/benchmark --kernel=coalesced --kernel=double_bufferWeek 3: 高级优化
Day 1-3: 寄存器分块
学习内容:
- 寄存器分块的原理
- 计算强度和 Roofline 模型
- 线程束级优化
阅读代码:
src/optimized_gemm.cu- Register Blocked 实现
练习题:
- 计算 Register Blocked GEMM 的算术强度
- 使用 Roofline 模型分析性能上限
Day 4-5: 算子融合
学习内容:
- 算子融合的收益
- GEMM + Bias + ReLU 融合
- 减少 kernel launch 开销
阅读代码:
src/fused_gemm.cu
Day 6-7: 向量化加载
学习内容:
- float4 向量化加载
- 内存对齐要求
- 向量化与性能
阅读代码:
src/vectorized_gemm.cu
Week 4: 工程实践
Day 1-2: 性能分析工具
学习内容:
- Nsight Compute 使用
- Nsight Systems 使用
- nvprof 命令行工具
实践任务:
bash
# 使用 Nsight Compute
ncu ./build-release/benchmark --kernel=vectorized
# 使用 Nsight Systems
nsys profile ./build-release/benchmarkDay 3-4: AutoTuner 和 Profiler
学习内容:
- 自动调参原理
- 性能分析器设计
- 参数搜索策略
阅读代码:
include/autotuner.hinclude/profiler.h
Day 5-7: 完整项目实践
实践任务:
- 实现一个新的 kernel 变体
- 使用 AutoTuner 寻找最优参数
- 添加单元测试
- 提交 PR
扩展阅读
论文
Volkov, Vasily. "Better performance at lower occupancy." GTC 2009.
- 寄存器分块和线程束级优化的经典论文
Hong, Sunpyo, and Hyesoon Kim. "An analytical model for the GPU architecture." ISPASS 2009.
- GPU 性能分析模型
Li, Shengen, et al. "The roofline model and performance analysis of GPU computing." IPDPS 2019.
- Roofline 模型在 GPU 上的应用
项目
- CUTLASS - NVIDIA 的 CUDA 模板库
- cuBLAS - NVIDIA 的 BLAS 库
- FlashAttention - 注意力机制优化
书籍
- Programming Massively Parallel Processors - David Kirk, Wen-mei Hwu
- CUDA C Best Practices Guide - NVIDIA 官方指南