Skip to content

学习路径

本文档提供从零开始学习 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 kernel
  • include/common.h - CUDA 错误处理宏

练习题:

  1. 修改 naive_matmul.cu,让每个线程计算 2 个输出元素,观察性能变化
  2. 使用 cudaGetDeviceProperties 查询你的 GPU 的线程块和线程束参数

Day 3-4: 内存层次结构

学习内容:

  • 全局内存的延迟和吞吐量
  • 共享内存的使用和 bank conflict
  • 寄存器的使用和溢出

阅读代码:

  • src/tiled_gemm.cu - 共享内存分块
  • src/coalesced_gemm.cu - 合并访存

练习题:

  1. tiled_gemm.cu 中修改 BLOCK_SIZE,观察性能如何变化
  2. 使用 Nsight Compute 分析 bank conflict

Day 5-7: Level 1-2 优化实践

学习内容:

  • Naive GEMM 的性能瓶颈分析
  • Tiled GEMM 的优化原理
  • 性能测量方法

实践任务:

bash
# 运行 benchmark
./build-release/benchmark --kernel=naive --kernel=tiled

练习题:

  1. 计算 Naive GEMM 的理论内存吞吐量,与实测值对比
  2. 分析 Tiled GEMM 相比 Naive 减少了多少全局内存访问

Week 2: 中级优化

Day 1-2: 合并访存优化

学习内容:

  • 合并访存的原理
  • 内存事务和对齐
  • bank conflict 的避免

阅读代码:

  • src/coalesced_gemm.cu

练习题:

  1. 使用 Nsight Compute 分析 coalesced_gemm.cu 的内存吞吐量
  2. 尝试修改线程块维度,观察对合并访存的影响

Day 3-4: 双缓冲优化

学习内容:

  • 计算与内存访问的重叠
  • 双缓冲技术
  • 流水线并行

阅读代码:

  • src/double_buffer_gemm.cu

练习题:

  1. 分析双缓冲如何隐藏内存延迟
  2. 测量不同矩阵规模下双缓冲的收益

Day 5-7: Level 3-4 优化实践

实践任务:

bash
# 对比性能
./build-release/benchmark --kernel=coalesced --kernel=double_buffer

Week 3: 高级优化

Day 1-3: 寄存器分块

学习内容:

  • 寄存器分块的原理
  • 计算强度和 Roofline 模型
  • 线程束级优化

阅读代码:

  • src/optimized_gemm.cu - Register Blocked 实现

练习题:

  1. 计算 Register Blocked GEMM 的算术强度
  2. 使用 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/benchmark

Day 3-4: AutoTuner 和 Profiler

学习内容:

  • 自动调参原理
  • 性能分析器设计
  • 参数搜索策略

阅读代码:

  • include/autotuner.h
  • include/profiler.h

Day 5-7: 完整项目实践

实践任务:

  1. 实现一个新的 kernel 变体
  2. 使用 AutoTuner 寻找最优参数
  3. 添加单元测试
  4. 提交 PR

扩展阅读

论文

  1. Volkov, Vasily. "Better performance at lower occupancy." GTC 2009.

    • 寄存器分块和线程束级优化的经典论文
  2. Hong, Sunpyo, and Hyesoon Kim. "An analytical model for the GPU architecture." ISPASS 2009.

    • GPU 性能分析模型
  3. Li, Shengen, et al. "The roofline model and performance analysis of GPU computing." IPDPS 2019.

    • Roofline 模型在 GPU 上的应用

项目

书籍

  • Programming Massively Parallel Processors - David Kirk, Wen-mei Hwu
  • CUDA C Best Practices Guide - NVIDIA 官方指南

MIT License | CUDA GEMM optimization tutorial