Chapter 03 · pipeline timing chamber
流水线
把单周期路径切成 5 个硬件阶段,观察指令同时飞行、依赖暴露、bubble 被注入,以及 forwarding 如何把等待变成旁路。
为什么单周期 CPU 注定慢
单周期 CPU 的时钟周期 = 所有指令中最长的那条 (通常是 lw)。 流水线把这条最长路径拆成 5 段,让 5 条指令同时占用 5 个不同的硬件, 理想情况下吞吐量提升 5 倍。
但有代价:冒险 (hazard)—— 后一条指令依赖前一条还没退役的结果。下面的 4 个场景演示数据冒险和它的 2 种缓解办法 (Forwarding 与 Stall)。
○ red = stall bubble · ✕ amber = branch flush · CPI = cycles / retired instructions
工程细节
三种冒险
- 数据冒险 (RAW):后一条读前一条未写完的寄存器。WAR/WAW 不出现(in-order 5 级流水线写回总按程序顺序)
- 控制冒险:分支跳转,流水线还没看到结果就取了下一条
- 结构冒险:两条指令同时要用同一个硬件(本章哈佛架构 + 寄存器堆双端口,基本避免)
Forwarding 的物理位置
Forwarding 网络在物理上是一组多路选择器 + 比较器: 把 EX/MEM 和 MEM/WB latch 里的结果直接送回 EX 输入。 它消除了大多数 RAW 冒险——但有一种例外消不掉:load-use。 原因物理:lw 的数据要到 MEM 阶段结束才出现,而紧跟的指令在 EX 就要用——必须等 1 拍。
现代 CPU 不是 5 级
教科书 5 级是 1980 年代 MIPS R2000 的设计。 Intel Skylake 是 14-19 级, Apple M 系 7-8 wide 发射 + 数百个 ROB 项。 深流水线让分支误预测代价更大——这是为什么分支预测器从 2-bit 计数器 进化到 TAGE 这种复杂结构(Ch04 详述)。