GPU 计算概述:从图形卡到计算利器
大家好,欢迎来到这门课。今天咱们先聊聊 GPU 计算的基础。
很多人觉得 GPU 是个黑盒子,塞进机器就能让程序飞起来。其实没那么神秘。我最早接触 GPU 计算时也挺懵的——当时还在用 CPU 跑矩阵乘法,一跑就是好几个小时。后来换了 GPU,同样的计算,几分钟就搞定了。那种冲击感,至今还记得。
这一章,我们就从 GPU 的架构演变讲起,看看它和 CPU 到底差在哪,以及为什么它在科学计算和深度学习里这么吃香。
GPU 架构简史:从渲染管线到通用计算
GPU 最初是为了图形渲染而生的。早期的 GPU,比如 90 年代的 3dfx Voodoo 和 NVIDIA GeForce 256,基本就是一条固定功能的渲染管线。你给它一堆三角形,它负责把它们变成屏幕上的像素。那时候没人会拿它做科学计算。
转折点出现在 2006 年。NVIDIA 发布了 GeForce 8800 GTX(核心架构叫 G80),这是第一块支持 CUDA 的 GPU。G80 把渲染管线里的顶点着色器和像素着色器统一成了通用的流处理器。说白了,就是你可以写一段自定义的 C 语言程序,让这些流处理器去跑,而不仅仅是做图形渲染。
我印象很深,当时有个同事拿 G80 跑了一个流体模拟,速度比 CPU 快了将近 20 倍。从那时起,GPU 计算就算正式登台了。
后来架构不断演进:
- Fermi(2010 年):首次引入真正的 L1/L2 缓存层级、ECC 内存支持,开始面向 HPC 市场。
- Kepler(2012 年):引入动态并行、Hyper-Q,让 GPU 能更灵活地调度任务。
- Maxwell(2014 年):大幅降低功耗,提升能效比,Tegra X1 等移动芯片也受益了。
- Pascal(2016 年):NVLink 高速互连、统一内存架构,让多卡通信不再那么痛苦。
- Volta(2017 年):引入 Tensor Core,专门为深度学习矩阵运算加速,这点非常关键。
- Turing(2018 年):加入 RT Core 做光线追踪,同时也增强了 Tensor Core。
- Ampere(2020 年):第三代 Tensor Core、稀疏化支持、MIG(多实例 GPU),让云上的 GPU 资源切分更灵活。
- Hopper(2022 年):Transformer Engine、DPX 指令集,专为大模型训练和推理优化。
嗯,这里有个小经验:架构越新,能效比和计算密度就越高。但并不是说你非要买最新的卡才能学。
GPU 与 CPU 的对比:一个是跑车,一个是卡车
经常有人问我:GPU 那么快,是不是 CPU 要淘汰了?
恰恰相反。CPU 和 GPU 各有所长,谁也替代不了谁。
CPU 的核心追求的是低延迟和复杂逻辑。它的单核很强,Cache 很大,分支预测和乱序执行做得非常好。你写一段 if-else 很密集的控制流代码,CPU 能很好处理。
GPU 的核心追求的是高吞吐量。它假设你做的是大量数据并行、无需频繁分支切换的计算。GPU 有上千个核心,但每个核心很弱,缓存也小。它的强项是“人多力量大”——用海量线程去填满显存带宽和计算单元。
放个表直接对比一下:
| 特性 | CPU | GPU |
|---|---|---|
| 控制单元 | 复杂(分支预测、乱序) | 简单(有序、SIMT) |
| 缓存 | 大(L1/L2/L3,几十 MB) | 小(L1/L2,几 MB) |
| 计算单元 | 4-32 个高性能 ALU | 上千个简单 CUDA Core |
| 内存带宽 | 几十 GB/s | 几百到几千 GB/s |
| 延迟敏感度 | 极敏感 | 不太敏感(靠线程切换隐藏) |
| 典型任务 | 操作系统、逻辑控制、单线程密集任务 | 矩阵乘法、图像处理、神经网络训练 |
| 功耗 | 几十瓦 | 几百瓦 |
我刚开始用 GPU 时犯过一个错误:拿 GPU 去跑大量递归和链表操作。结果性能比 CPU 还差。后来才明白,GPU 其实不喜欢“指来指去”的数据结构,它更喜欢连续的内存布局和规整的循环。
GPU 在科学计算与深度学习中的优势
了解了架构和对比,我们来聊聊 GPU 在哪些领域特别吃香。
科学计算:矩阵运算和 PDE 求解
科学计算里最常见的就是线性代数运算:BLAS、FFT、稀疏矩阵求解。这些运算有很强的数据并行性。一个矩阵乘法,可以切成几千个小块,让 GPU 的不同线程块去算。结果就是,一块 GPU 跑出 CPU 几十倍的吞吐量。
我记得以前做气象模型,一个网格是 1024x1024,每个时间步要更新 50 个变量。纯 CPU 跑一个时间步要 3 秒,换 GPU 后降到了 50 毫秒。整个模拟从几天变成了几小时。
很多专门的 GPU 加速库也出现了:
- cuBLAS:NVIDIA 官方的高度优化 BLAS 实现。
- cuFFT:FFT 计算。
- cuSPARSE:稀疏矩阵求解。
- cuSOLVER:稠密矩阵的分解和求解。
使用起来很简单,比如调用 cuBLAS 的矩阵乘法:
#include <cublas_v2.h>
cublasHandle_t handle;
cublasCreate(&handle);
float alpha = 1.0f, beta = 0.0f;
// C = alpha*A*B + beta*C
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N,
m, n, k, &alpha,
d_A, lda, d_B, ldb, &beta,
d_C, ldc);
cublasDestroy(handle);
你看,代码里基本就是矩阵参数和GPU指针,剩下的优化都由库帮你做了。
深度学习:从卷积到 Transformer
深度学习对 GPU 的需求更大。训练一个模型,动辄几十亿次浮点运算,CPU 根本扛不住。GPU 的并行架构和高速显存正好是它的天生搭档。
具体来说,GPU 在深度学习里的优势体现在:
- 卷积运算:每个卷积核可以对输入的不同位置做并行滑窗计算。
- 矩阵乘法 (GEMM):全连接层、注意力机制、多头自注意力,本质上都是矩阵乘法。
- Tensor Core:从 Volta 架构开始加入,专门做 4x4 矩阵的乘加运算(FP16、BF16、INT8),速度远超普通 CUDA Core。我在项目里测过,同样的 Batch Size,用 Tensor Core 跑 ResNet-50,训练速度快了将近 3 倍。
可视化概述:GPU 计算的知识体系
下面这张图浓缩了我们这一章的核心内容。从 CPU 与 GPU 的定位差异出发,沿着架构演进、当前优势到实际应用场景,形成一个完整的知识地图。
这张图把 GPU 计算的知识体系串了起来。中间那一条线是从架构→优势→生态→应用。你可以把它当成你后续学习的思维导图。
好了,这一章就到这里。下一阶段我们会深入 CUDA 编程模型——从线程网格到共享内存,慢慢把理论变成你可以动手跑起来的代码。