1. GPU计算概述:CPU与GPU的区别、发展历程、应用场景
各位同学,咱们直接开门见山。GPU 这玩意儿,十年前还只是打游戏用的“显卡”,现在呢?几乎每个搞深度学习的、做科学计算的,手里都攥着一块。我最早接触 GPU 计算是在 2012 年,那时候用 CUDA 写一个矩阵乘法都能兴奋半天。嗯,一晃这么多年,GPU 早已不是当年的“图形加速卡”了。
1.1 CPU vs GPU —— 到底差在哪?
很多人以为 GPU 就是“更强的 CPU”,其实不是。CPU 是“通才”,什么活都能干,但一次只能干几件事。GPU 是“专才”,一次能同时干成千上万件简单的事。我打个比方:CPU 就像 3 个顶级大厨,能做佛跳墙也能做分子料理;GPU 就像 300 个帮厨,专门切土豆丝,一秒切一万根。
为什么会这样?看架构就明白了。
| 对比维度 | CPU | GPU |
|---|---|---|
| 核心数量 | 4~16 个高性能核心 | 数千个简单核心(如 4096 CUDA 核心) |
| 控制单元 | 复杂分支预测 + 大缓存 | 极简控制,依赖大量线程隐藏延迟 |
| 缓存策略 | 大容量 L1/L2/L3 缓存 | 小缓存,但带宽极高 |
| 擅长任务 | 串行、逻辑复杂、分支多 | 数据并行、计算密集、吞吐优先 |
| 典型功耗 | 65~150W | 150~450W(但算力/瓦特在并行任务中更优) |
说白了,CPU 适合当“项目经理”,GPU 适合当“搬砖工”。但搬砖工多了,也能盖起摩天大楼。我在项目中遇到过不少新手,拿 GPU 去跑 if-else 特别多的逻辑,结果比 CPU 还慢。记住:GPU 最怕分支发散,它喜欢“大家做一样的事”。
1.2 GPU 计算的发展历程 —— 从“画图”到“算力”
我刚开始写 CUDA 的时候,还是 Fermi 架构时代(2010年左右)。那时候 GPU 计算还是个“小众玩具”。一晃十几年,架构都迭代了好几代。我整理了一个简表,帮你快速建立时间线:
| 年代 | 架构/事件 | 我的印象 |
|---|---|---|
| 2006 | NVIDIA 发布 CUDA,GPU 通用计算元年 | 当时大家觉得“显卡能算科学计算?疯了吧” |
| 2010 | Fermi 架构,首次支持 ECC 内存、双精度 | 我记得第一次跑双精度矩阵乘法,激动得不行 |
| 2012 | Kepler 架构,GK104 核心,能效大幅提升 | 深度学习开始萌芽,GPU 成了炼丹炉 |
| 2017 | Volta 架构,Tensor Core 诞生 | 混合精度训练起飞,我调过不少 Tensor Core 的坑 |
| 2020+ | Ampere / Hopper / Blackwell,Transformer 专用引擎 | 现在 GPU 已经是大模型时代的“印钞机”了 |
其实 GPU 计算能火起来,离不开三个推手:游戏产业(砸钱造芯片)、深度学习(需求爆炸)、以及 CUDA 生态(降低门槛)。我个人觉得,CUDA 的出现才是真正的转折点。以前你想用 GPU 算东西,得用图形 API(OpenGL/DirectX)把数据伪装成纹理,那叫一个痛苦。CUDA 直接让你写 C 语言,舒服太多了。
1.3 GPU 计算的应用场景 —— 不止是深度学习
很多人一提到 GPU 就想到“训练神经网络”。没错,这确实是目前最火的方向。但 GPU 计算的应用范围比你想的宽得多。我随便列几个我实际参与过的项目:
- 科学计算:分子动力学(比如 GROMACS)、气象模拟、计算流体力学。我帮一个气象团队优化过 WRF 模型,用 GPU 加速辐射传输模块,速度提升了 8 倍。
- 金融工程:蒙特卡洛模拟、风险定价。期权定价模型里,每个路径都是独立的,GPU 一算就是几百万条路径,爽得很。
- 图像/视频处理:实时滤镜、编解码、光流法。OpenCV 的 CUDA 模块我经常用,处理 4K 视频毫无压力。
- 数据库与数据分析:GPU 加速 SQL 查询(比如 RAPIDS cuDF)、大规模排序、哈希连接。你想想看,几亿行数据做 group by,GPU 几毫秒就搞定。
- 实时渲染与光线追踪:虽然这是老本行,但 RTX 系列把光追带到了实时领域,也反过来推动了计算架构的进化。
嗯,这里要注意:并不是所有应用都适合 GPU。如果你的数据量很小(比如几百个点),或者逻辑分支极其复杂,那 CPU 可能更快。我一般会先问自己三个问题:数据是否并行?计算密度高不高?分支是否简单? 如果三个都是“是”,那 GPU 就是你的菜。
上面这张图基本概括了本章的核心脉络。你可以看到,GPU 计算不是孤立的技术,它和架构、编程模型、应用场景紧紧绑在一起。我个人习惯在学新东西前先画一张这样的图,把知识点串起来,心里就有谱了。
1.4 一个小例子:感受 GPU 的“暴力”并行
光说不练假把式。虽然咱们还没正式写代码,但我给你看一个极简的伪代码片段,感受一下 GPU 的思维方式:
// CPU 版本:循环串行
for (int i = 0; i < 1000000; i++) {
C[i] = A[i] + B[i];
}
// GPU 版本(CUDA 伪代码):每个线程处理一个元素
__global__ void vec_add(float *A, float *B, float *C) {
int i = threadIdx.x + blockIdx.x * blockDim.x;
C[i] = A[i] + B[i]; // 100万个线程同时执行!
}
// 启动 10000 个 block,每个 block 128 个线程
vec_add<<<10000, 128>>>(A, B, C);
看到了吗?CPU 老老实实循环一百万次,GPU 直接开一百万个线程,每人算一个加法。这就是“并行”的暴力美学。当然,实际工程中要考虑内存合并、bank conflict 等等,但核心思想就是这个。
好了,第一章就聊到这儿。GPU 计算的世界很大,咱们后面会一步步深入。记住今天的关键词:吞吐优先、数据并行、架构演进、场景匹配。下一章我们会真正动手搭建 CUDA 开发环境,到时候再细聊。