CPU 与 GPU
CPU & GPU Microarchitecture
CPU 是通用计算的'全能选手',GPU 是并行计算的'人海战术'——两种截然不同的处理器哲学。
CPU 微架构是实现指令集架构(ISA)的硬件设计。核心组件包括:控制单元(Control Unit)负责取指、译码、执行;ALU 执行算术和逻辑运算;寄存器文件存储操作数;总线连接各组件。现代 CPU 使用流水线(Pipelining)技术,将指令执行分为多个阶段(取指、译码、执行、访存、写回),每个时钟周期完成一条指令。更高级的技术包括超标量(Superscalar,每周期执行多条指令)、乱序执行(Out-of-Order Execution)、分支预测(Branch Prediction)。 GPU(Graphics Processing Unit)最初为图形渲染设计,现已成为通用并行计算(GPGPU)的核心硬件。与 CPU 的'少量强核心'设计不同,GPU 采用'海量弱核心'架构——NVIDIA H100 拥有 16896 个 CUDA 核心,而顶级 CPU 通常只有数十个核心。GPU 的核心设计哲学是 SIMT(Single Instruction, Multiple Threads):同一条指令同时作用于数千个线程,每个线程处理不同的数据。GPU 的晶体管大部分用于计算单元(ALU),而非 CPU 中大量的缓存和控制逻辑。
寄存器和 ALU 只能执行单个操作,无法自动执行指令序列。CPU 微架构引入'取指-译码-执行'循环,使计算机能够自动执行存储在内存中的程序。这是从'计算器'到'通用计算机'的飞跃。流水线技术进一步提升性能,使现代 CPU 达到每时钟周期执行多条指令的吞吐量。 GPU 的存在源于一个根本性的权衡:CPU 为低延迟优化(快速处理复杂逻辑和分支),GPU 为高吞吐量优化(同时处理海量简单任务)。当一个问题可以分解为数千个独立的相同操作时(如矩阵乘法、图像渲染、深度学习推理),GPU 的吞吐量可以比 CPU 高出 10-100 倍。这就是为什么 AI 训练和推理严重依赖 GPU。
程序员通过汇编语言和高级语言使用 CPU 的抽象。理解 CPU 微架构有助于理解:为什么循环展开能提升性能(减少分支);为什么分支预测失败代价高昂(流水线清空);为什么缓存命中率对性能至关重要(内存访问延迟)。性能优化工具(如 perf、VTune)直接分析 CPU 微架构事件。 GPU 编程通过 CUDA(NVIDIA)、ROCm(AMD)、OpenCL(跨平台)等框架进行。程序员编写核函数(Kernel),由 GPU 的数千个核心并行执行。关键编程模型:将数据组织为线程块(Thread Block)和网格(Grid),每个线程处理一个数据元素。GPU 编程的核心挑战:避免线程间的分支分歧(warp divergence)、优化显存访问模式(合并访问)、管理有限的共享内存(Shared Memory)。
Bottom-up:由下层如何构建
本层建立在以下层级之上:
Top-down:向上暴露什么接口
Programmer View:程序员视角
我能操作吗?
CPU 通过指令集架构(ISA)间接操作,x86-64、ARM、RISC-V 是常见 ISA。GPU 通过 CUDA/ROCm/OpenCL 编程,核函数在 GPU 上并行执行。现代框架(PyTorch、TensorFlow)自动将张量运算映射到 GPU。
成本模型
| 指标 | 量级 | 备注 |
|---|---|---|
| CPU 时钟频率 | 2-5 GHz | 现代 CPU 主频 |
| CPU IPC | 2-4 instructions/cycle | 超标量处理器每周期执行指令数 |
| CPU 流水线深度 | 14-19 级 | 现代 CPU 流水线阶段数 |
| CPU 分支预测失败代价 | 15-20 周期 | 流水线清空惩罚 |
| GPU 核心数 | 数千到数万 | NVIDIA H100: 16896 CUDA 核心 |
| GPU 显存带宽 | 1-3 TB/s | H100 HBM3: 3.35 TB/s,远超 CPU 的 ~100 GB/s |
| GPU 浮点算力 | 数十 TFLOPS | H100 FP16: ~990 TFLOPS(含稀疏) |
| CPU→GPU 数据传输 | PCIe 带宽瓶颈 | PCIe 5.0 x16: ~64 GB/s,远低于显存带宽 |
常见陷阱
- !分支预测失败(CPU):条件跳转导致流水线清空,浪费 15-20 个时钟周期。热点循环应尽量减少分支
- !缓存未命中(CPU):内存访问延迟 100+ 周期,L1 缓存命中仅 4 周期。数据局部性对性能至关重要
- !假共享(CPU):多核修改同一缓存行的不同变量,导致缓存一致性协议频繁失效
- !GPU 分支分歧:同一 warp(32 线程)中的线程走不同分支路径时,两条分支串行执行,性能骤降
- !GPU 显存传输开销:CPU↔GPU 数据拷贝通过 PCIe 总线,带宽远低于显存。频繁的小数据传输会严重拖慢性能
- !GPU 占用率不足:线程数不够或寄存器使用过多导致活跃 warp 不足,无法隐藏显存访问延迟