CUDA-Practice:00 系列导读——从带宽墙到多卡通信的学习路线
本文目标
读完本文,你将能够:
- 知道这套
CUDA-Practice博客到底覆盖了哪些问题,以及它们之间的先后关系 - 根据自己的背景,选择一条更短、更有效的阅读路线,而不是从 15 篇专题里盲目跳读
- 明确每篇博客在仓库中的定位:它不是孤立文章,而是和代码、Results、性能分析相互对应的一组材料
配套仓库:
psmarter/CUDA-Practice
本系列文章与仓库中的源码、实验结果、目录结构相互对应;建议阅读文章时同步对照仓库中的实现。
这个系列到底在讲什么
这套博客并不是按“API 功能清单”去组织的,而是按 GPU 性能问题是如何一步步暴露出来的 来组织的。
如果把整个系列压缩成一句话,它回答的是下面这个问题:
当一个 CUDA 程序从“能跑”走向“接近硬件上限”时,你需要先理解哪些物理约束,再学习哪些并行模式,最后如何把这些东西落到大模型推理、多流调度和多卡通信里?
因此,这 15 篇专题文章实际上可以分成 5 个层次:
- 基础与访存直觉:理解带宽墙、合并访存、Shared Memory、Tiling,这决定了你能不能看懂后面几乎所有优化。
- 通用并行模式:归约、前缀和、Warp Shuffle,这些是 Softmax、LayerNorm、Scan、Block 级协作的底层模板。
- 矩阵计算主线:从 Tiled GEMM、寄存器分块到 Tensor Core、CUTLASS、cuBLAS,这是最典型的“从手写核到工业实现”的升级路线。
- LLM 推理主线:Softmax、Norm、RoPE、FlashAttention、量化、KV Cache、算子融合、多流调度,最后再扩展到多卡。
- 统一诊断与对标:Roofline、Occupancy、Nsight、标准库对标,用来判断“你到底还差在哪里”。
系列全景图
可以把当前博客理解成两条主线、两个横切主题:
1 | 00 导读 |
其中:
- 01 基础概念与分块 是整个系列的地基。
- 02 归约与线程粗化、03 前缀和与多块扫描、06 线程束原语与寄存器通信 解决的是最常见的并行协作模板。
- 04 矩阵乘优化与寄存器分块、09 张量核心与混合精度、14 模板矩阵乘与代数布局 构成了矩阵乘优化主链。
- 05 大模型算子与注意力归一化、07 量化、半精度与整数推理、11 推理优化、融合与键值缓存、08 多流、图执行与扩展开发、15 多卡通信与全归约 对应的是从单算子到系统级推理的主线。
- 10 访存优化与共享内存冲突、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 一起看
这个仓库不是单纯的文章合集。更有效的阅读顺序通常是:
- 先读博客,建立问题、瓶颈和优化思路。
- 再去对应代码目录看 Kernel 和 Host 侧封装,确认实现细节。
- 最后对照
Results里的测试规模、吞吐、加速比和分析结论,判断优化是否真的成立。
如果你只看博客,容易停留在“原理懂了”;如果你只看代码,容易不知道为什么要这么写;如果你只看结果表,又容易把数字当成结论而忽略前提。三者放在一起看,信息才是闭环的。
如果你时间有限,只读这几篇
如果你只能抽出很少时间,我建议优先读下面 6 篇:
- 01 基础概念与分块:建立整个系列最重要的带宽墙与 Tiling 直觉。
- 04 矩阵乘优化与寄存器分块:理解“为什么快”和“为什么还不够快”。
- 05 大模型算子与注意力归一化:把基础并行模式映射到真实 LLM 算子。
- 10 访存优化与共享内存冲突:补齐最常见、也最容易被误判的性能瓶颈。
- 13 性能分析、屋顶线与占用率:学会判断优化值不值得继续做。
- 15 多卡通信与全归约:把视角从单卡扩展到系统级问题。
从哪一篇开始
如果你准备正式进入这个系列,下一篇建议直接从 01 基础概念与分块 开始。
它会建立后续所有文章都会反复出现的三个关键词:
- 带宽墙
- Roofline
- Tiling
一旦这三个概念站稳,后面的归约、Scan、Warp Shuffle、GEMM、Tensor Core、FlashAttention、CUTLASS 和 NCCL 都会变得顺很多。
顺序导航
- 上一篇:无,这是系列导读。
- 下一篇:CUDA实践-01-基础概念与分块

