由于 trendforge.devlive.top 访问受限,请切换到 trendforge.devlive.org 域名

学习路径指南
难度等级
入门/初级
预计时长
1-2周
适合人群
对GPU编程和深度学习优化感兴趣,但无CUDA经验的开发者、AI工程师或学生。

学习目标:你将理解CUDA编程基础,并能编写、调试和优化简单的CUDA内核,为学习高性能AI算子(如HGEMM、FlashAttention)打下基础。

前置知识

C/C++编程基础 熟悉

CUDA内核使用C/C++语法编写,需要理解指针、数组、函数和内存管理。

基础线性代数 了解

项目核心是矩阵运算(GEMM),理解矩阵乘法的定义和维度即可。

深度学习框架基础 (PyTorch) 了解

项目大量使用PyTorch进行数据准备、调用和验证,需了解Tensor的基本操作。

Linux命令行操作 了解

编译和运行CUDA程序通常需要在Linux环境下进行。

学习步骤

1

环境准备与项目初探

0.5-1天

搭建CUDA开发环境

确保你有一块NVIDIA GPU(架构Turing/Ampere等较新),并安装了合适的NVIDIA驱动、CUDA Toolkit(如12.x)和cuDNN。建议使用Docker(如NVIDIA NGC容器)避免环境冲突。

可通过 `nvidia-smi` 检查驱动和CUDA版本。

克隆项目并熟悉目录结构

克隆LeetCUDA仓库到本地。浏览目录,重点关注 `kernels/`(内核代码)、`docs/`(文档)、`interview/`(面试笔记)和根目录下的示例脚本。

使用 `tree` 或 `ls -R` 命令快速了解结构。

编译并运行第一个简单示例

在项目根目录或子目录中找到一个最简单的示例(如 `vector_add`),尝试编译(`make` 或 `nvcc` 命令)并运行,验证环境正确。

注意Makefile或CMakeLists.txt中的路径和依赖设置。

2

CUDA核心概念学习

2-3天

理解CUDA编程模型

学习GPU架构、线程层次(Thread, Block, Grid)、内存层次(Global, Shared, Register)、内核启动语法(`<<<grid, block>>>`)。结合项目中的 `easy` 难度内核代码(如 `vector_add.cu`, `relu.cu`)进行阅读和实践。

项目README中“Easy ⭐️”部分的内核是最佳学习材料。

学习基本内核优化技巧

在简单内核中实践:1) 线程粗化(Thread Coarsening),2) 合并内存访问(Coalesced Access),3) 使用共享内存减少全局内存访问。

使用 `nvprof` 或 `Nsight Systems/Compute` 工具分析内核性能瓶颈。

阅读并理解一个完整示例

选择一个 `Medium ⭐️⭐️` 难度的内核(如 `layernorm.cu` 或 `rmsnorm.cu`),完整阅读其前向和后向传播代码,理解如何将PyTorch逻辑用CUDA实现。

重点关注数据如何在Host和Device间传输,以及内核的线程映射逻辑。

3

深入核心功能:GEMM与FlashAttention

5-7天

学习矩阵乘法(GEMM)基础实现

从 `kernels/hgemm/` 目录下找到最朴素的CUDA GEMM实现(如 `naive` 版本),理解三重循环映射到GPU线程的逻辑。然后,逐步学习共享内存分块(Tiling)、寄存器分块等优化。

画图理解矩阵如何被分块,以及线程块如何协作计算一个输出块。

探索高性能HGEMM优化

研究 `hard` 或 `hard+` 难度的HGEMM实现(如使用 `WMMA` 或 `MMA` 指令的版本)。理解Tensor Core的用法、数据预取、双缓冲、多阶段流水线等高级技术。

对照项目README中HGEMM Benchmark表格,理解每一项优化技术(如`Copy Async`, `Multi Stages`)的作用。

理解FlashAttention算法与CUDA实现

首先通过项目链接的博客或论文理解FlashAttention的核心思想(分块计算、Online Softmax)。然后,从 `kernels/flash-attn/` 中找一个简单的 `Split KV` 版本进行代码阅读,理解Q, K, V在内核中的分块计算流程。

FlashAttention的CUDA实现非常复杂,初学阶段目标是理解其宏观的算法映射,而非每个细节。

4

实践、调试与扩展

3-4天

动手修改和实验

选择一个你已理解的简单内核(如向量加法或矩阵加法),尝试修改其配置(如Block大小、线程粗化因子),并重新编译运行,观察性能变化。

使用PyTorch的输出作为基准,验证你修改后的内核输出是否正确。

学习项目中的调试与验证方法

研究项目中是如何将CUDA内核的结果与PyTorch的结果进行比较的(通常使用 `torch.allclose`)。理解如何为你的内核编写类似的单元测试。

正确性验证是开发CUDA内核的第一步,性能优化是第二步。

阅读Triton和CUTLASS示例

浏览 `Triton` 和 `CUTLASS` 部分的内核代码,了解这些高层编程范式如何简化CUDA内核的编写。比较同一功能(如 `softmax`)在CUDA、Triton下的代码复杂度。

这部分是拓展视野,理解不同抽象层次的GPU编程方法。

推荐资源

NVIDIA CUDA Programming Guide 必看

CUDA编程的权威参考,详细说明了API、内存模型和优化策略。

项目内README和代码注释 必看

LeetCUDA项目本身就是最好的教程,其代码注释和文档(如`docs/`目录)非常详细。

《Programming Massively Parallel Processors》 推荐

经典的CUDA教材,从基础到高级概念讲解清晰,配有大量例子。

项目链接的100+ LLM/CUDA Blogs 推荐

README中链接了大量作者撰写的技术博客,深度解析FlashAttention、HGEMM等主题,是深入学习的宝库。

NVIDIA Nsight Systems & Compute 推荐

性能分析和调试CUDA内核的必备工具,用于可视化时间线、检测内存瓶颈和占用率。

学习路径常见错误

1

内存访问未合并(Uncoalesced Access)导致性能低下。

确保连续的线程访问连续的内存地址。在内核设计时,优先让线程的索引变化在最快的维度(通常是x维度)上连续。

2

同步(`__syncthreads()`)使用不当导致竞争条件或死锁。

确保所有线程都到达同步点,且在同步点前后对共享内存的访问模式是正确的。从简单内核开始实践。

3

忽略Host与Device间的数据传输开销,将数据频繁拷贝。

尽量将数据在设备端保持长时间驻留,复用内存。使用CUDA流(Streams)和异步操作来重叠计算与传输。

4

过早进行复杂的优化,而忽略了基本实现的正确性。

遵循“先做对,再做快”的原则。先用最朴素的方式实现功能,并与PyTorch结果对比验证,然后再逐步应用优化技术。

5

不理解GPU的层级内存(Shared Memory, Registers)及其限制,导致内核启动失败或正确性问题。

深入学习GPU内存层次,了解每种内存的容量、速度和访问模式。使用 `cudaFuncGetAttributes` 检查内核的资源使用情况。

学习路径下一步步骤

学完本指南后,你可以:1. 挑战项目中的 `Hard` 或 `Hard+` 难度内核实现;2. 深入研究 `FlashAttention-2` 和 `FFPA-Attention` 的纯CUDA MMA实现;3. 尝试使用 `Triton` 或 `CUTLASS` 重写你已掌握的CUDA内核,体会不同范式;4. 将所学应用于优化你自己项目中的AI模型算子。

助手