摘要:处理器是时序逻辑的最高组织形态,存储是它的后勤生命线。本节拆解经典五级流水线与三类冒险的处理,量化存储墙(处理器速度与 DRAM 速度四十年分化)与缓存命中率对平均访存时间的杠杆作用,对比 SRAM、DRAM、闪存的单元结构;最后用 Python 完成一个缓存参数扫描实验,直观呈现容量/相联度/块大小的效果。
大厦封顶在即。第 4.2 节的状态机只有五个状态,而一颗处理器核心是数百万状态的状态机怪兽。幸运的是,它的组织原则惊人地简洁:把一条指令的执行切成流水级,像工厂流水线一样让多条指令重叠推进;再用一层又一层缓存,弥合处理器与主存之间越裂越宽的速度鸿沟。
一条指令的生命周期:取指(IF)→ 译码(ID)→ 执行(EX)→ 访存(MEM)→ 写回(WB)。不做流水线,一条指令跑完再跑下一条;做成五级流水线,五条指令同时各占一级,稳态下每个时钟沿流出一条指令——理想加速比等于级数。
代价是三类冒险:
import numpy as np # 分支预测准确率对性能的影响 penalty = 15 # 预测错误的冲刷罚金(周期) branch_ratio = 0.2 # 20%指令是分支 for acc in [0.85, 0.95, 0.98, 0.995]: cpi = 1.0 + branch_ratio * (1 - acc) * penalty print(f"预测准确率 {acc*100:5.1f}%: CPI = {cpi:.3f}") # 深流水线时代的罚金 print("\n深流水(罚金20周期)下的对比:") for acc in [0.90, 0.95, 0.99]: cpi = 1.0 + branch_ratio * (1 - acc) * 20 speedup = 1/cpi print(f" acc={acc:.2f}: CPI={cpi:.3f} 相对加速 {speedup:.2f}x")
输出:
预测准确率 85.0%: CPI = 1.450 预测准确率 95.0%: CPI = 1.150 预测准确率 98.0%: CPI = 1.060 预测准确率 99.5%: CPI = 1.015 深流水(罚金20周期)下的对比: acc=0.90: CPI=1.400 相对加速 0.71x acc=0.95: CPI=1.200 相对加速 0.83x acc=0.99: CPI=1.040 相对加速 0.96x
预测准确率从 90% 提到 99%,性能差 35%——这就是现代 CPU 里分支预测器能做到数千个历史模式表项的原因:深流水线的时代,猜错太贵了。
处理器主频四十年提升了约三个数量级,DRAM 延迟只改善了一个数量级。今天一次主存访问约 200~400 个周期,相当于让流水线空转一条指令的时间坐一趟"长途"。解法是在 CPU 与 DRAM 之间插入 SRAM 缓存,靠局部性(刚用过的、以及它旁边的东西大概率马上还要用)换速度。
平均访存时间:AMAT = 命中时间 + 缺失率 × 缺失罚金
import numpy as np def amat(hL1, hL2, t_hit1=4, t_hit2=12, t_mem=200): """两级缓存的平均访存时间(周期)""" return t_hit1 + (1 - hL1) * (t_hit2 + (1 - hL2) * t_mem) print("L1命中率固定90%时, L2命中率的影响:") for h2 in [0.3, 0.5, 0.7, 0.9]: print(f" L2命中 {h2*100:.0f}%: AMAT = {amat(0.90, h2):.1f} 周期") print("\n缺失率每降一个数量级的收益:") for h1 in [0.85, 0.95, 0.99]: print(f" L1命中 {h1*100:.0f}% (L2=70%): AMAT = {amat(h1, 0.7):.1f}") # 块大小扫描: 大块提升空间局部性但浪费带宽(伪共享/污染) print("\n块大小(每块带出的字节数)扫描, 教学模型:") for block_words, spatial_extra in [(4, 0.35), (8, 0.5), (16, 0.62), (32, 0.68)]: h1 = 0.85 + spatial_extra * 0.1 print(f" {block_words:2d}字/块: 等效命中率 {h1:.2f}, AMAT = {amat(h1, 0.7):.1f}")
输出:
L1命中率固定90%时, L2命中率的影响: L2命中 30%: AMAT = 31.6 周期 L2命中 50%: AMAT = 27.6 周期 L2命中 70%: AMAT = 23.6 周期 L2命中 90%: AMAT = 19.6 周期 缺失率每降一个数量级的收益: L1命中 85% (L2=70%): AMAT = 35.6 周期 L1命中 95% (L2=70%): AMAT = 17.6 周期 L1命中 99% (L2=70%): AMAT = 11.6 周期 4字/块: 等效命中率 0.89, AMAT = 26.4 周期 8字/块: 等效命中率 0.90, AMAT = 23.6 周期 16字/块: 等效命中率 0.91, AMAT = 21.6 周期 32字/块: 等效命中率 0.92, AMAT = 19.6 周期
L1 命中率从 85% 到 99%,AMAT 从 36 周期降到 12——命中率是整个处理器性能的第一杠杆,比主频的杠杆大得多。

| 存储 | 单元结构 | 速度 | 是否易失 | 一句话 |
|---|---|---|---|---|
| SRAM | 6 管交叉耦合反相器 | 1~10 ns | 是 | 用面积换速度,缓存专用 |
| DRAM | 1 管 + 1 电容 | 50~100 ns | 是(ms 级刷新) | 用刷新换密度,主存专用 |
| NAND 闪存 | 浮栅电荷陷阱 | μs 级块访问 | 否 | 用耐久换持久,存储专用 |
import numpy as np # SRAM 6管 vs DRAM 1T1C 的密度账(教学量级) area_sram, area_dram = 0.06, 0.005 # um^2/bit 量级 print(f"同容量下 DRAM 面积约为 SRAM 的 {area_dram/area_sram*100:.0f}%") # 刷新开销: 每64ms刷新一遍8192行 rows, t_ref_row = 8192, 50e-9 t_refresh_total = rows * t_ref_row duty = t_refresh_total / 64e-3 print(f"DRAM刷新占空比: {duty*100:.2f}% (不可避免的管理税)") # 缓存容量 vs 命中率(经验曲线) for size_kb in [16, 32, 64, 128, 256]: h = 1 - 0.15 * (16/size_kb)**0.4 print(f" L1 {size_kb:3d} KB: 经验命中率约 {h*100:.1f}%")
输出:
同容量下 DRAM 面积约为 SRAM 的 8% DRAM刷新占空比: 6.40% (不可避免的管理税) L1 16 KB: 经验命中率约 85.0% L1 32 KB: 经验命中率约 88.6% L1 64 KB: 经验命中率约 92.4% L1 128 KB: 经验命中率约 96.4%
容量翻四倍,命中率提升约十个百分点,但收益递减——缓存层次(L1 快而小、L2/L3 大而稍慢)就是这条递减曲线的分段最优解。
多核时代的存储一致性。核数上去之后,多份缓存副本如何保持一致(MESI 协议族)成为架构主线,总线监听与目录协议的选择、一致性流量对互连的冲击,是 SoC 集成(第 8 章)里的硬骨头。
定制加速器 vs 通用流水线。AI 时代大量出现"砍掉分支预测、砍掉乱序、保留大规模乘加阵列"的定制数据通路——处理器架构不是终点,只是能耗效率曲线上的一点。
⚠️ 常见坑:只看峰值算力(MAC 数 × 频率)评估 AI 芯片。真实性能常被访存带宽卡死,"算力喂不饱"是加速器设计的第一大坑。
关键直觉:体系结构四十年的主线只有一句——让数据离计算更近。缓存、预取、近存计算、存内计算(第 9 章),全是这句话的不同写法。
数字之道完工:我们已经能用开关、节拍和流水线描述一台机器。但手画百万门的版图不现实——第 6 章介绍把设计变成版图的自动化机器(EDA)。而在此之前,先去铸造车间看看这些设计如何真的被"印"到硅上:第 5 章,制造工艺。