本文目标

读完本文,你将能够:

  • 知道这套 CUDA-Practice 博客到底覆盖了哪些问题,以及它们之间的先后关系
  • 根据自己的背景,选择一条更短、更有效的阅读路线,而不是从 15 篇专题里盲目跳读
  • 明确每篇博客在仓库中的定位:它不是孤立文章,而是和代码、Results、性能分析相互对应的一组材料

配套仓库:psmarter/CUDA-Practice
本系列文章与仓库中的源码、实验结果、目录结构相互对应;建议阅读文章时同步对照仓库中的实现。

这个系列到底在讲什么

这套博客并不是按“API 功能清单”去组织的,而是按 GPU 性能问题是如何一步步暴露出来的 来组织的。

如果把整个系列压缩成一句话,它回答的是下面这个问题:

当一个 CUDA 程序从“能跑”走向“接近硬件上限”时,你需要先理解哪些物理约束,再学习哪些并行模式,最后如何把这些东西落到大模型推理、多流调度和多卡通信里?

因此,这 15 篇专题文章实际上可以分成 5 个层次:

  1. 基础与访存直觉:理解带宽墙、合并访存、Shared Memory、Tiling,这决定了你能不能看懂后面几乎所有优化。
  2. 通用并行模式:归约、前缀和、Warp Shuffle,这些是 Softmax、LayerNorm、Scan、Block 级协作的底层模板。
  3. 矩阵计算主线:从 Tiled GEMM、寄存器分块到 Tensor Core、CUTLASS、cuBLAS,这是最典型的“从手写核到工业实现”的升级路线。
  4. LLM 推理主线:Softmax、Norm、RoPE、FlashAttention、量化、KV Cache、算子融合、多流调度,最后再扩展到多卡。
  5. 统一诊断与对标:Roofline、Occupancy、Nsight、标准库对标,用来判断“你到底还差在哪里”。

系列全景图

可以把当前博客理解成两条主线、两个横切主题:

1
2
3
4
5
00 导读
├─ 基础主线:01 → 02 → 03 → 06 → 10
├─ GEMM 主线:01 → 04 → 09 → 14 → 12
├─ LLM 主线:05 → 07 → 11 → 08 → 15
└─ 诊断横线:13 贯穿所有主线,12 提供工业基准

其中:

每篇文章解决什么问题

编号 文章 解决的问题 建议前置
01 基础概念与分块 为什么 Vector Add 很快却跑不满算力,为什么 GEMM 必须做 Tiling
02 归约与线程粗化 如何把大量元素聚合成一个结果,并减少同步与调度浪费 01
03 前缀和与多块扫描 如何保留中间前缀结果,并把 Scan 从单块扩展到多块 02
04 矩阵乘优化与寄存器分块 Shared Memory 已经不够后,如何继续把数据推入寄存器 01
05 大模型算子与注意力归一化 Softmax、Norm、RoPE、FlashAttention 为什么各自慢、各自难 02、06
06 线程束原语与寄存器通信 如何绕开 Shared Memory,在 Warp 内做更低延迟的协作 02、03
07 量化、半精度与整数推理 如何用 FP16/INT8 换带宽、换吞吐,同时控制精度风险 04、05
08 多流、图执行与扩展开发 单个 Kernel 已经够快后,端到端为什么还慢 05、10
09 张量核心与混合精度 如何从 CUDA Core 标量 FMA 切换到 Tensor Core 矩阵指令 04、07
10 访存优化与共享内存冲突 合并访存、Bank Conflict、Async Copy 为什么会决定上限 01、06
11 推理优化、融合与键值缓存 如何把多个单算子优化串成真正能提吞吐的推理系统 05、07、10
12 标准库与工程实践 什么时候该自己写 Kernel,什么时候该直接调库 04、09
13 性能分析、屋顶线与占用率 你怎么证明自己已经快了,或者还为什么不够快 01、04、10
14 模板矩阵乘与代数布局 工业级 GEMM 框架为什么复杂,它到底在抽象什么 04、09、12
15 多卡通信与全归约 单卡已经压满后,多卡训练/推理还会卡在哪里 08、11、13

推荐阅读路线

路线一:零基础入门 CUDA

适合第一次系统学 CUDA 的读者。

1
00 导读 → 01 基础概念与分块 → 02 归约与线程粗化 → 03 前缀和与多块扫描 → 06 线程束原语与寄存器通信 → 10 访存优化与共享内存冲突 → 13 性能分析、屋顶线与占用率

这条路线的重点不是“大而全”,而是先建立一套正确直觉:访存先于算力,协作模式先于花哨技巧,诊断先于盲目优化。

路线二:专攻 GEMM 与高性能算子

适合关注矩阵乘、Tensor Core、CUTLASS 的读者。

1
00 导读 → 01 基础概念与分块 → 04 矩阵乘优化与寄存器分块 → 09 张量核心与混合精度 → 14 模板矩阵乘与代数布局 → 12 标准库与工程实践 → 13 性能分析、屋顶线与占用率

这条路线会带你经历一次完整升级:从手写 Tiled GEMM,到寄存器阻塞,再到 WMMA/Tensor Core,最后进入 CUTLASS 和标准库的工业视角。

路线三:专攻 LLM 推理优化

适合已经在做 Transformer/推理服务的读者。

1
00 导读 → 05 大模型算子与注意力归一化 → 07 量化、半精度与整数推理 → 11 推理优化、融合与键值缓存 → 08 多流、图执行与扩展开发 → 15 多卡通信与全归约

这条路线关注的是端到端吞吐,而不是单个 Kernel 的局部最优。它把算子、数据类型、缓存策略、调度和通信串成了一条链。

路线四:专攻性能诊断与工程决策

适合需要做性能对标、做技术选型的读者。

1
00 导读 → 01 基础概念与分块 → 10 访存优化与共享内存冲突 → 13 性能分析、屋顶线与占用率 → 12 标准库与工程实践 → 14 模板矩阵乘与代数布局

如果你的核心问题是“该自己写还是调库”“瓶颈到底在哪”“优化是否真的有效”,这条路线最直接。

怎么把博客、代码和 Results 一起看

这个仓库不是单纯的文章合集。更有效的阅读顺序通常是:

  1. 先读博客,建立问题、瓶颈和优化思路。
  2. 再去对应代码目录看 Kernel 和 Host 侧封装,确认实现细节。
  3. 最后对照 Results 里的测试规模、吞吐、加速比和分析结论,判断优化是否真的成立。

如果你只看博客,容易停留在“原理懂了”;如果你只看代码,容易不知道为什么要这么写;如果你只看结果表,又容易把数字当成结论而忽略前提。三者放在一起看,信息才是闭环的。

如果你时间有限,只读这几篇

如果你只能抽出很少时间,我建议优先读下面 6 篇:

从哪一篇开始

如果你准备正式进入这个系列,下一篇建议直接从 01 基础概念与分块 开始。

它会建立后续所有文章都会反复出现的三个关键词:

  • 带宽墙
  • Roofline
  • Tiling

一旦这三个概念站稳,后面的归约、Scan、Warp Shuffle、GEMM、Tensor Core、FlashAttention、CUTLASS 和 NCCL 都会变得顺很多。


顺序导航