Chapter 04 · out-of-order execution lab
现代 CPU 的魔法
用前台派单、工位等待、广播喇叭和取餐号来观察 Tomasulo + ROB: 指令可以乱序完成, 但对外必须按程序顺序提交。
为什么“代码不是按你写的顺序在跑”
5 级流水线已经能让多条指令同时飞行,但现代 CPU 更进一步: 它会把能先做的指令先做掉,把还缺操作数的指令挂在 Reservation Station里等待。这个等待区像厨房工位: 原料一到就开工,不必等前面的慢菜。
乱序不能改变程序语义,所以 CPU 还需要 Reorder Buffer。 ROB 像取餐小票: 哪个工位先做好都可以先登记结果,但最终交付必须从队头开始。 下面的 Lab 只做一个完整切片: 发射、等待、执行、广播、顺序提交。
准备观察乱序机器
从队头开始发射。请把 ROB 想成取餐号: 后面的餐可以先做好, 但交给顾客必须按号。
指令拿到 ROB 小票, 再去对应工位。
原料没到就等; 原料到齐就可以先做。
做好的结果喊给所有等待者。
不管谁先做好, 只从 ROB 队头交付。
先从仓库拿到原料 F2
慢工位: 用 F2 做乘法
等乘法结果后再相加
另一条加法可提前完成
可接下一张小票
可接下一张小票
可接下一张小票
可接下一张小票
结果不是悄悄交给一个人,而是广播给 ROB 和所有等待这个小票的工位。
空小票
空小票
空小票
空小票
预测正确,流水线继续填充,无气泡。
循环回边高度偏 taken,简单历史预测几乎总是对。
0 次 · 本步 penalty 0 cycles
本章学习地图
MVP Lab · Tomasulo + ROB
目标不是先背名词,而是看懂一条指令怎么拿号、怎么进工位、怎么等别人广播结果, 以及为什么后面的 ADD 可能先算完,却不能越过前面的 MUL 对外提交。
验收点: 你能用“取餐号”类比解释内部乱序完成与外部顺序提交的差别。
MVP Lab · 分支预测与误预测惩罚
上面的 Branch Lab 展示 taken/not-taken 历史如何驱动预测,以及误预测如何 清空投机路径。循环回边和条件分支的行为差异在这里可以直接看见。
下一层 · SIMD 与侧信道
SIMD 与侧信道专题会在后续迭代中沿用同样的状态机 + 可回放 Lab 结构。
为什么旧版页面要替换
旧版 ch04 是概念卡片: 名词齐全,但读者看不到状态随时间变化。 对不懂计算机的人来说,“Reservation Station / ROB / CDB”仍是抽象词。 新版把它们落到四个稳定物件: 队列、工位、广播、取餐号。