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 指令集,专为大模型训练和推理优化。

嗯,这里有个小经验:架构越新,能效比和计算密度就越高。但并不是说你非要买最新的卡才能学。

个人建议:如果你的预算有限,一块 RTX 3060 或 A4000 就足够入门了。大部分 K80 和 P100 的 CUDA 核心也完全够用。别为了追求 Hopper 而掏空钱包。

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 能万能加速。数据搬运(CPU↔GPU 内存拷贝)开销很大。如果你一次计算量很小,或者需要频繁和 CPU 同步,那总时间可能比纯 CPU 还慢。我曾经在一个项目里,因为数据量太小,结果 PCIe 传输时间占掉了 90%…… 从那以后,我就特别强调“数据局部性”和“内核合并”。

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 算力(TFLOPS)以及显存带宽成正相关。一块 H100 的 FP16 算力可以达到 2000 TFLOPS,而普通 CPU 可能连 1 TFLOPS 都不到。这就是为什么大语言模型训练几乎离不开 GPU。

可视化概述:GPU 计算的知识体系

下面这张图浓缩了我们这一章的核心内容。从 CPU 与 GPU 的定位差异出发,沿着架构演进、当前优势到实际应用场景,形成一个完整的知识地图。

GPU 计算知识体系框架 GPU 计算知识体系框架 CPU vs GPU 定位差异 架构演进(G80→Hopper) 核心优势(吞吐 vs 延迟) 库与生态(cuBLAS 等) Fermi / Kepler / Maxwell Pascal / Volta / Turing / Ampere / Hopper 高吞吐量 + 数据并行 数千线程 + 高带宽显存 cuBLAS / cuFFT / cuSPARSE cuSOLVER / TensorRT / CUTLASS 主要应用场景:科学计算 + 深度学习 关键:数据搬运开销大 → 内核合并 + 局部性优化 适合大规模并行、规整内存访问的运算

这张图把 GPU 计算的知识体系串了起来。中间那一条线是从架构→优势→生态→应用。你可以把它当成你后续学习的思维导图。

好了,这一章就到这里。下一阶段我们会深入 CUDA 编程模型——从线程网格到共享内存,慢慢把理论变成你可以动手跑起来的代码。