CPU 微架构核心概念 —— 缓存、流水线、超标量、SMT
ISA 决定 CPU “能做什么“,微架构决定 CPU “做得多快“。这一篇讲六个最关键的微架构概念——理解它们,你就能看懂 Intel/AMD 每代 CPU 发布会上”IPC +15%”背后到底改了什么。
缓存层级(Cache Hierarchy)
CPU 频率早就突破 5 GHz,但 DRAM 访问延迟仍在 ~80 ns(约 400 个 CPU 周期)。如果每次取数据都等 DRAM,CPU 大部分时间都在干等。缓存就是为了把”常用数据”留在离 CPU 更近的地方。
graph LR CPU[CPU 核心
~5 GHz] L1[L1 Cache
32-64 KB / 核
~4 cycles] L2[L2 Cache
1-4 MB / 核
~12 cycles] L3[L3 Cache
共享 32-512 MB
~40 cycles] DRAM[(DRAM
GB 级
~200 cycles)] CPU --- L1 --- L2 --- L3 --- DRAM
| 层 | 容量 | 访问周期 | 是私有还是共享 |
|---|---|---|---|
| L1 | 32-64 KB | 3-5 周期 | 每核私有 |
| L2 | 0.5-4 MB | 10-15 周期 | 每核私有(部分架构是 cluster 共享) |
| L3 | 32-512 MB | 30-50 周期 | 全 socket 共享(AMD 是 CCD 内共享) |
| DRAM | GB 级 | 200+ 周期 | - |
L1 通常分两个:L1I(指令)和 L1D(数据)——这就是”修正的哈佛架构”。
Inclusive vs Non-inclusive
L3 缓存设计的两种风格,Intel 在 Skylake 时期切换过:
| Inclusive | Non-inclusive / Exclusive | |
|---|---|---|
| 含义 | L3 必含 L2 中所有数据 | L3 不一定包含 L2 数据 |
| 优点 | 一致性协议简单(snoop 只查 L3) | L3 容量利用率高 |
| 缺点 | L3 容量有”重复” | 一致性协议复杂 |
| Intel | Haswell 及之前 | Skylake 起改为 Non-inclusive |
| AMD | 一直 Exclusive | - |
大缓存的 V-Cache 突破
AMD 在 Milan-X / Genoa-X / Turin-X 上引入 3D V-Cache——在 CCD 上方堆叠一层额外的 L3 die,把每核 L3 从 32 MB 加到 96 MB。
对缓存敏感型工作负载(HPC、EDA、数据库),V-Cache 单代提升 30-50%。这是 3D 封装在 CPU 上的第一个杀手级应用。
流水线(Pipeline)
流水线把一条指令的执行切成多个阶段,每个阶段用不同的硬件单元,让多条指令在不同阶段同时推进。
最经典的 5 级流水:
graph LR IF[取指
Fetch] --> ID[译码
Decode] --> EX[执行
Execute] --> MEM[访存
Memory] --> WB[写回
Write Back]
理想情况下,每个时钟周期完成一条指令——但实际上要远远复杂。现代 x86 服务器 CPU 的流水线通常 14-20 级深:
| 阶段类别 | 作用 |
|---|---|
| 前端 | 取指、分支预测、指令缓存、译码、µop 缓存 |
| 后端调度 | 重命名、分发、排队 |
| 后端执行 | ALU、FPU、向量、Load/Store |
| 后端提交 | 写回、退休 |
超流水线 vs 超标量
| 概念 | 含义 | 实质 |
|---|---|---|
| 超流水线(Super-pipelining) | 把流水线切得更细更深 | 以时间换空间 |
| 超标量(Superscalar) | 同一周期内并行执行多条指令 | 以空间换时间 |
现代 CPU 既超流水线又超标量。比如 Skylake:
- 流水线 14-19 级深
- 后端可同时调度 8 条 µop 到不同执行单元
- 译码每周期 4-5 条指令
Pentium 4 的教训
Intel 曾经走过”超长流水线”的极端:Pentium 4 的 NetBurst 架构流水线 20-31 级,目标是把频率推到 10 GHz。结果:
- 流水线越深,分支预测错误代价越大
- 漏电(leakage)随频率非线性增加
- 5 GHz 之后撞上”功耗墙”
Pentium 4 的失败让 Intel 在 Core 微架构(2006)回归相对短的流水线 + 高 IPC——这是现代 CPU 设计哲学的重要转折。
乱序执行(Out-of-Order Execution)
一条指令可能因为等数据从内存来而停顿。如果严格按程序顺序执行,后面所有指令都得等。
乱序执行的思路:
1 | |
实现要点:
- 寄存器重命名:消除假相关(WAR、WAW)
- 重排序缓冲(ROB):跟踪所有”在飞”的指令
- 保留站 / 调度器:哪条指令准备好了就发射执行
- 退休(retire):按程序顺序确认指令”真正完成”
ROB 的容量决定乱序窗口有多大。Skylake ROB 224 条,Sapphire Rapids 512 条,Zen 5 也在 400+。ROB 越大,能”看得越远”,越能容忍内存延迟。
分支预测(Branch Prediction)
CPU 取指要提前几十个周期,但遇到分支就不知道下一条指令在哪——除非等条件结果。
分支预测器猜测”分支会走哪边”,让流水线可以提前取指。预测对了:流水线全速;预测错了:清空流水线,损失 15-20 周期。
| 预测器类型 | 准确率 |
|---|---|
| 静态预测 | ~60% |
| 一级历史表 | ~80% |
| 两级自适应(gshare 类) | ~95% |
| 现代神经网络/感知器风格预测器 | >97% |
现代 CPU 的分支预测器已经接近”完美”——但剩下那 2-3% 的错误,仍是高性能计算的主要瓶颈之一。
注:Spectre/Meltdown 系列漏洞就利用了分支预测器的”推测执行”特性,2018 年后所有 CPU 都加入了缓解措施(部分会损失性能)。
同步多线程(SMT / 超线程)
Hyper-Threading(HT) 是 Intel 对 SMT(Simultaneous Multi-Threading)的商品名,AMD 直接叫 SMT。
原理:一个物理核对操作系统暴露成两个逻辑核,共享 ALU/FPU/缓存等执行单元,但有独立的寄存器和指令窗口。
graph LR
subgraph CORE["1 个物理核"]
HT0[逻辑核 0
独立寄存器]
HT1[逻辑核 1
独立寄存器]
ALU[共享 ALU/FPU/Cache]
HT0 --- ALU
HT1 --- ALU
end
为什么有用:当一个线程因为 cache miss 卡住时,另一个线程可以利用空闲的执行单元——把核的利用率从 40-50% 提到 60-80%。
SMT 的代价和争议
| 争议点 | 说明 |
|---|---|
| 性能收益 | 平均 20-30%,但取决于负载 |
| 缓存压力 | 两个线程共享 L1/L2,可能反而互相挤兑 |
| 侧信道安全 | Spectre v3 和 L1TF 相关,多租户云上风险 |
| 部分核心去 SMT | Intel E-core(Atom 系)、Sierra Forest 全系都不带 SMT |
云厂商对 SMT 的态度也分两派:
- AWS、GCP:默认开 SMT,按 vCPU 卖(1 vCPU = 1 逻辑核)
- Azure 一些实例、阿里 ECI:关闭 SMT,按物理核卖
一张总结
graph LR IF[取指] --> BP[分支预测] BP --> DEC[译码] DEC --> RR[重命名] RR --> RES[保留站] RES --> ALU/FPU/MEM[执行单元] ALU/FPU/MEM --> ROB[ROB] ROB --> RET[退休] CACHE[多级缓存] --- IF CACHE --- ALU/FPU/MEM SMT[SMT 双线程] -.- RES
现代 CPU 的高性能 = 多级缓存 + 深流水线 + 多发射 + 乱序 + 分支预测 + SMT,六者缺一不可。每代 IPC 提升的本质,是这六个机制的某些部分被改进、扩展、重设计。
性能查询:lscpu / cpuid / dmidecode
Linux 上常用的 CPU 信息查询命令:
1 | |
flags 里要关注的:
avx2 / avx512f / avx512_*—— SIMD 能力amx_*—— Intel AMX 矩阵扩展sve / sve2 / sme—— ARM 向量能力vmx / svm—— 硬件虚拟化aes / sha_ni—— 加密加速pcid / smap / smep—— 安全特性
小结
- 微架构是”同样 ISA 跑得多快”的答案
- 六个核心概念:缓存层级、流水线、超标量、乱序执行、分支预测、SMT
- Pentium 4 是”过深流水线 + 高频”的反面教材
- 现代 IPC 改进 = 在六个机制的细节上抠出来的
- SMT 的实用性已确定,但安全和云租户隔离上有持续争议
下一篇讲多核架构和 NUMA——单核到位之后,多核之间怎么协作。