☰ GPU 编程基础

全部文档/系列目录

GPU 编程基础:给 CPU 程序员的 GPU 教程

这一页写给这样的读者:会 C/C++,知道线程、cache 和向量化是什么,但没系统写过 CUDA。所以不假设你懂 warp、occupancy、bank conflict;每个概念第一次出现时都给定义、给数字量级,再给一段能编译的短代码。

与 CPU 相同的部分只做速览:IEEE 浮点、补码、局部性、Amdahl、先测量再优化。重点放在真正不同的地方:SIMT 与分支发散、显式内存层级与合并访问、显式同步与弱内存模型、主机/设备分离、异步错误、以及必须靠测量判断的性能。

代码用 CUDA C++,nvcc -O3 -arch=native 可编译,面向 sm_70 及以上。为了短,片段只保留核心逻辑;完整的 host 骨架与错误检查见第 6 节。文中的硬件数字以 H100 SXM(132 SM、3.35 TB/s、67 TFLOPS FP32)为参照,换卡后结论不变、常数要换。

怎么读

章节

一张表看完 CPU 与 GPU 的差别

下面这张表是整份教程的提纲:每一行在后面的章节里都会展开。

维度CPUGPU直接后果
优化目标降低单线程延迟提高总吞吐GPU 单线程更慢,靠并行补回来
并行单元8–128 个重量级核,每核乱序执行 + SIMD60–160 个 SM,上万条 lane线程要十万级才喂得饱
主频2.5–5.5 GHz1.0–2.5 GHz串行段落在 GPU 上慢 10–50 倍
分支预测 + 推测执行SIMT 掩码,路径串行分支密集代码可能慢一倍以上
缓存硬件自动管理多级 cache显式 shared memory + 弱一致 cache数据复用要自己搬
内存统一地址空间,可换页、可超卖独立显存,手动拷贝,不可超卖传输可能吃掉全部收益
同步锁、条件变量、futexbarrier、原子、fence没有 mutex,跨 block 同步很难
启动开销函数调用,纳秒级kernel launch,约 5 µs小任务不要拆成多个 kernel
错误模型同步异常 / 信号异步错误码,可能“粘住”每个 API 都要查返回值
抢占时间片抢占block 一旦开始通常跑完长 kernel 会拖住整卡
编程模型共享内存 + 锁SIMT + 显式数据搬运移植不是换个 API 那么简单

符号与术语

符号 / 术语含义本教程的取值
warpGPU 的调度单位,固定 32 个 lane32
SM流多处理器,GPU 的基本计算单元H100 有 132 个
\(N\)元素个数—
\(T\)分块边长(tile size)示例用 32
\(P\)峰值算力\(67\times10^{12}\) FLOP/s(FP32)
\(BW\)内存带宽\(3.35\times10^{12}\) B/s
\(I\)算术强度,每字节做多少次浮点运算FLOP/byte
occupancy常驻 warp 数 / 硬件上限0–100%

公式用本地 KaTeX 渲染;样式与 KaTeX 都在 ../assets 下,断网也能看。如果要把 gpu 目录单独拷走,记得一并带上 assets,否则公式和排版会失效。