CUDA核心概念快速入门:一文看懂warp、共享内存与tile(Maths, CS & AI Compendium GPU编程指南)
【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium
Maths, CS & AI Compendium是一本从零基础讲起、覆盖数学、计算机科学与AI/ML的非传统开源教材。本文基于其第16章「SIMD与GPU编程」,带你快速搞懂 CUDA 编程中最核心的三个概念——warp(线程束)、共享内存和tile(分块),即使不写一行 CUDA 代码,也能建立正确的 GPU 性能心智模型。
为什么AI/ML人必须懂GPU编程?
训练一个 Transformer 需要数万亿次乘加运算,而 CPU 通常只有 4–128 个核心,现代 NVIDIA GPU 则有超过10,000 个 CUDA 核心。这就是 GPU 统治深度学习的原因。
| CPU | GPU | |
|---|---|---|
| 核心数 | 4–128(复杂、快) | 1,000–20,000(简单、多) |
| 设计目标 | 低延迟(把单个任务做完) | 高吞吐(每秒完成更多任务) |
| 缓存 | 大(32MB+ L3) | 小(每SM一块共享内存) |
| 分支预测 | 精密 | 无(同一warp内线程走同一条路径) |
| FP32算力 | 1–5 TFLOPS | 30–80 TFLOPS |
| 内存带宽 | 50–100 GB/s | 1–3 TB/s |
💡关键洞察:GPU 的内存带宽优势(10–30倍)往往比算力优势更重要。大量 ML 操作(逐元素运算、归一化、注意力)都是访存密集型的——瓶颈不在计算,而在喂数据。
GPU如何分任务:Grid、Block、Thread三层结构
CUDA 把一次内核(kernel)启动的任务组织成三层金字塔:
- Thread(线程):最小执行单元,每个线程有唯一 ID,负责一小块数据
- Block(线程块):一组最多1024 个线程,可以共享内存、互相同步
- Grid(网格):一次启动的所有 Block,可达数百万个
可以类比成:Grid 是一个大工地,Block 是一个施工班组,Thread 是班组里的一名工人。每个线程通过「班组号 × 班组人数 + 自己在班组的编号」算出自己的全局工位,各干各的活。
warp是什么:GPU速度的秘密(与代价)
GPU 并不按单个线程执行,而是以warp(线程束)为单位——32 个线程组成一个 warp,同一时刻执行同一条指令(SIMT 模型,即 GPU 版的 SIMD)。
这就是 GPU 快的原因:32 路并行零开销。
⚠️ 但这也带来一个著名陷阱——warp 分歧(warp divergence):
- 当同一 warp 里的线程在
if/else中走不同分支时,GPU 无法同时执行两条指令,只能串行执行两个分支,并用掩码屏蔽不该参与的线程 - 结果:性能直接腰斩甚至更差
实用建议:写内核时尽量让判断条件对所有线程一致,或改写为无分支形式(例如用乘数/系数代替 if),这是新手最容易忽略的性能点。
共享内存与tile:GPU调优最重要的优化
先认识 GPU 的内存层级——离核心越近,越快但越小:
| 内存 | 容量 | 延迟 | 作用域 |
|---|---|---|---|
| 寄存器 | ~256 KB/SM | 0 周期 | 每个线程 |
| 共享内存 | 48–228 KB/SM | ~5 周期 | 同一 Block |
| L1 / L2 缓存 | 128KB–96 MB | ~30 / ~200 周期 | SM / 全局 |
| 全局内存(HBM) | 24–192 GB | ~400 周期 | 全局 |
Tiling(分块)模式正是 GPU 编程的看家技巧:
- 从慢速的全局内存,把一个TILE_SIZE × TILE_SIZE 的数据小方块(tile)一次性载入快速的共享内存
- Block 内所有线程直接对这个 tile 反复计算
- 算完再写入全局内存
没有 tiling 时,矩阵乘法的每个线程每次乘加都要跑一趟全局内存;有了 tiling,数据加载一次、被整个 Block 复用 TILE_SIZE 次,全局内存流量直接减少相应倍数。这就是为什么矩阵乘法是 GPU 上最经典的性能教学案例。
3条你应该记住的CUDA性能法则
- 合并访问(coalescing):让相邻线程访问相邻地址,GPU 会把 32 个请求合并成一次 128 字节的事务;跨步访问(strided)则可能把带宽利用率打到 3%
- 避免warp分歧:分支越少越快,必要时改写为无分支代码
- 内核融合(kernel fusion):把
matmul → 加bias → ReLU三步合成一个内核,中间结果不再落盘——这是 ML 中最有影响力的单点优化,PyTorch 的torch.compile正是在自动化这件事
📌 还有一个方法论:先**剖析(profile)**再优化。NVIDIA 的 Nsight 工具链(ncu/nsys)可以告诉你瓶颈是内存、算力还是延迟——大多数 ML 负载是访存密集型,换更快的 GPU 往往不如换更快的内存管用。
继续学习:教材相关章节与资料清单
想动手写代码或深挖原理,教材第16章是完整的学习路线:
- 入门动机与框架原理:chapter 16 - SIMD and GPU programming/00. why C++ and how ML frameworks work.md
- 硬件基础与Roofline模型(判断访存/计算瓶颈):chapter 16 - SIMD and GPU programming/01. hardware fundamentals.md
- 本文核心章节,含完整CUDA内核示例与3个编程任务:chapter 16 - SIMD and GPU programming/04. GPU architecture and CUDA.md
- 跨平台视野(Triton、TPU等):chapter 16 - SIMD and GPU programming/05. triton, TPUs and pallax.md
- 推理侧延伸(量化、混合精度与Tensor Core):chapter 17 - AI inference/01. quantisation.md
- 全书章节索引:llms.txt · 项目总览:README.md
该仓库还内置了一个MCP 服务器(源码见 mcp/src/index.ts),可以让 Claude Code、Cursor 等 AI 助手直接把这本教材当知识库调用。它需要一个本地仓库副本:
git clone https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium小结:GPU 用「海量简单核心 + 分层内存」换吞吐;warp 是它的执行节拍,共享内存 + tile 是它的加速杠杆,合并访问与内核融合是它的日常纪律。掌握这几点,你就读懂了 GPU 编程的一半——另一半,去第16章把代码跑起来吧。⚡
【免费下载链接】maths-cs-ai-compendiumBecome a cracked AI/ML researcher/engineer with this unconventional textbook covering maths, computing, and ML with intuition.项目地址: https://gitcode.com/GitHub_Trending/mat/maths-cs-ai-compendium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考