GPU 和 CPU 的区别?为什么挖矿、大模型都用 GPU?
一句话:CPU 为**延迟(latency)优化,GPU 为吞吐(throughput)**优化。挖矿与大模型都是"同一段运算作用在海量互不依赖的数据上", 正好命中 GPU 的强项,而 CPU 的乱序执行、分支预测、大缓存在这里几乎帮不上忙。
1. 晶体管花在哪
CPU 单个核心(几十亿晶体管,核数 8~128)
┌─────────────────────────────────────────┐
│ 取指/译码 │ 分支预测 │ 乱序调度 │ 寄存器堆 │
│ L1 64KB │ L2 1~2MB │ 大容量 L3 共享 │
│ ALU×4 │ FPU │ SIMD(256/512bit) │
└─────────────────────────────────────────┘
→ 大量晶体管用于"让少数指令流尽快结束"
GPU 一个 SM / CU(数万线程,数百个计算单元)
┌─────────────────────────────────────────┐
│ 控制单元(很小)│ 共享内存/L1(可编程) │
│ ALU ALU ALU ALU ALU ALU ALU ALU ... ×N │
└─────────────────────────────────────────┘
→ 大量晶体管用于"同时算更多份"
CPU 靠缓存和推测把内存延迟(约 100ns)藏起来,一次只关心几个线程;GPU 不藏延迟,而是同时挂起成千上万个线程, 某个 warp(线程束)等数据时立刻切到另一个 warp,用并发度把延迟"摊平"。
2. 关键维度对比
| 维度 | CPU | GPU |
|---|---|---|
| 核心数 | 几十个,单核极强 | 数千个流处理器(stream processor) |
| 主频 | 3~5GHz | 1~2GHz(更低,靠并行补) |
| 缓存 | 多级大缓存 + 预取 | 小缓存,靠共享内存手工管理 |
| 分支处理 | 分支预测、推测执行 | 同一 warp 内分支发散(divergence)会串行化 |
| 编程模型 | 线程/进程,任意控制流 | SIMT,成千上万线程执行同一 kernel |
| 擅长 | 逻辑复杂、分支多、串行依赖 | 规则、稠密、数据并行的计算 |
| 内存 | DDR,容量大、可扩展 | HBM/显存,带宽高但容量固定 |
| 延迟 | 低 | 单个线程访问延迟更高 |
3. 为什么挖矿和大模型都选 GPU
共同点是算术强度(arithmetic intensity,FLOPs/Byte)高、数据并行度高、控制流简单:
- 挖矿:对 nonce 反复做 SHA-256d,每个 nonce 完全独立,没有分支也没有跨迭代依赖,纯粹是"每秒能算多少次哈希"。
- 大模型:每一层的主体是矩阵乘(GEMM)与注意力计算,参数量以百亿计,一次前向要做的浮点运算远多于要搬运的字节, 瓶颈落在算力而非延迟。
用 Amdahl 定律看更直接:若 95% 的时间可以并行,即使并行部分无限快,加速比上限也只有 20 倍; 反过来,只要并行比例足够高,堆算力就是划算的。
4. 代码:同一份运算的两种写法
// CUDA:一个线程负责一个下标,线程数即并行度
__global__ void add(const float* a, const float* b, float* c, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) c[i] = a[i] + b[i]; // 无分支、无跨线程依赖
}
// 主机侧:block=256,grid 覆盖全部元素
add<<<(n + 255) / 256, 256>>>(a, b, c, n);
// CPU:单核顺序扫,提速只能靠多线程 + SIMD
for (int i = 0; i < n; i++) c[i] = a[i] + b[i]; // 每次迭代都在等流水线
# 观察 GPU 是否真的在算,而不是在等数据
nvidia-smi --query-gpu=utilization.gpu,memory.used,power.draw --format=csv -l 1
5. 常见追问
Q:GPU 这么快,为什么不用它当通用 CPU? 因为大量真实负载分支多、依赖链长、数据不规则。GPU 一旦遇到分支发散,同一 warp 内不同路径要串行执行, 控制单元又弱,性能会塌到不如 CPU。操作系统、编译器这类负载在 GPU 上根本跑不动。
Q:什么是合并访存(coalesced access)? 同一 warp 的 32 个线程若访问连续地址,硬件能把它们合成少量内存事务;若地址离散,一次请求会被拆成几十次, 带宽利用率骤降。这就是"GPU 编程要按行优先、对齐访问"的原因。
Q:显存和内存有什么区别? 显存(VRAM/HBM)与 GPU 直连,带宽可达数 TB/s,但容量固定、不可换页;内存通过 PCIe 与 GPU 通信, 带宽低一个数量级。所以大模型推理的第一道门槛往往是"显存装不装得下权重 + KV Cache"。
Q:GPU 为什么功耗高? 同样面积塞进更多运算单元,且高频高带宽访存,功耗自然上去。数据中心的瓶颈常常是每机柜的供电与散热, 而不是芯片本身。
小结
CPU 用复杂控制换低延迟,GPU 用简单控制换高吞吐。判断一个任务该不该上 GPU,只看三点: 数据是否可切分成大量独立单元、分支是否足够少、算术强度是否足够高。挖矿和大模型三条全中, 而事务处理、脚本解释这类负载三条全不中。