GPU计算概述 · 第1章

1. GPU计算概述:CPU与GPU的区别、发展历程、应用场景

各位同学,咱们直接开门见山。GPU 这玩意儿,十年前还只是打游戏用的“显卡”,现在呢?几乎每个搞深度学习的、做科学计算的,手里都攥着一块。我最早接触 GPU 计算是在 2012 年,那时候用 CUDA 写一个矩阵乘法都能兴奋半天。嗯,一晃这么多年,GPU 早已不是当年的“图形加速卡”了。

1.1 CPU vs GPU —— 到底差在哪?

很多人以为 GPU 就是“更强的 CPU”,其实不是。CPU 是“通才”,什么活都能干,但一次只能干几件事。GPU 是“专才”,一次能同时干成千上万件简单的事。我打个比方:CPU 就像 3 个顶级大厨,能做佛跳墙也能做分子料理;GPU 就像 300 个帮厨,专门切土豆丝,一秒切一万根。

为什么会这样?看架构就明白了。

对比维度CPUGPU
核心数量4~16 个高性能核心数千个简单核心(如 4096 CUDA 核心)
控制单元复杂分支预测 + 大缓存极简控制,依赖大量线程隐藏延迟
缓存策略大容量 L1/L2/L3 缓存小缓存,但带宽极高
擅长任务串行、逻辑复杂、分支多数据并行、计算密集、吞吐优先
典型功耗65~150W150~450W(但算力/瓦特在并行任务中更优)

说白了,CPU 适合当“项目经理”,GPU 适合当“搬砖工”。但搬砖工多了,也能盖起摩天大楼。我在项目中遇到过不少新手,拿 GPU 去跑 if-else 特别多的逻辑,结果比 CPU 还慢。记住:GPU 最怕分支发散,它喜欢“大家做一样的事”。

⚡ 核心区别一句话:CPU 优化延迟,GPU 优化吞吐。

1.2 GPU 计算的发展历程 —— 从“画图”到“算力”

我刚开始写 CUDA 的时候,还是 Fermi 架构时代(2010年左右)。那时候 GPU 计算还是个“小众玩具”。一晃十几年,架构都迭代了好几代。我整理了一个简表,帮你快速建立时间线:

年代架构/事件我的印象
2006NVIDIA 发布 CUDA,GPU 通用计算元年当时大家觉得“显卡能算科学计算?疯了吧”
2010Fermi 架构,首次支持 ECC 内存、双精度我记得第一次跑双精度矩阵乘法,激动得不行
2012Kepler 架构,GK104 核心,能效大幅提升深度学习开始萌芽,GPU 成了炼丹炉
2017Volta 架构,Tensor Core 诞生混合精度训练起飞,我调过不少 Tensor Core 的坑
2020+Ampere / Hopper / Blackwell,Transformer 专用引擎现在 GPU 已经是大模型时代的“印钞机”了

其实 GPU 计算能火起来,离不开三个推手:游戏产业(砸钱造芯片)、深度学习(需求爆炸)、以及 CUDA 生态(降低门槛)。我个人觉得,CUDA 的出现才是真正的转折点。以前你想用 GPU 算东西,得用图形 API(OpenGL/DirectX)把数据伪装成纹理,那叫一个痛苦。CUDA 直接让你写 C 语言,舒服太多了。

💡 避坑指南:我曾经在 Kepler 架构上写过一段原子操作密集的代码,性能惨不忍睹。后来才发现,老架构的原子操作吞吐极低。所以,写 GPU 代码一定要了解当前架构的特性,别拿老经验套新卡。

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 加速。结果呢?数据量太小,PCIe 传输开销比计算还大,最终比 CPU 还慢。所以,别盲目上 GPU,先做 profiling
GPU 计算概述 CPU vs GPU 延迟优化 vs 吞吐优化 发展历程 Fermi → Hopper → Blackwell 应用场景 科学计算 · 金融 · 图像 · AI 数千核心 · 小缓存 CUDA / OpenCL / HIP 矩阵乘 · 卷积 · 蒙特卡洛 数据并行 + 计算密集 = 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 等等,但核心思想就是这个。

🔧 我刚开始写 CUDA 时,总喜欢把线程数设得特别大,以为越多越快。后来发现,线程太多会导致寄存器溢出,性能反而下降。合适的 block size 一般是 128~256,具体得看架构。

好了,第一章就聊到这儿。GPU 计算的世界很大,咱们后面会一步步深入。记住今天的关键词:吞吐优先、数据并行、架构演进、场景匹配。下一章我们会真正动手搭建 CUDA 开发环境,到时候再细聊。