D
← 返回 RuntimeScope 首页

Chapter 04 · out-of-order execution lab

现代 CPU 的魔法

用前台派单、工位等待、广播喇叭和取餐号来观察 Tomasulo + ROB: 指令可以乱序完成, 但对外必须按程序顺序提交。

为什么“代码不是按你写的顺序在跑”

5 级流水线已经能让多条指令同时飞行,但现代 CPU 更进一步: 它会把能先做的指令先做掉,把还缺操作数的指令挂在 Reservation Station里等待。这个等待区像厨房工位: 原料一到就开工,不必等前面的慢菜。

乱序不能改变程序语义,所以 CPU 还需要 Reorder Buffer。 ROB 像取餐小票: 哪个工位先做好都可以先登记结果,但最终交付必须从队头开始。 下面的 Lab 只做一个完整切片: 发射、等待、执行、广播、顺序提交。

LIVE TOMASULO LAB
当前步骤 · cycle 0 · init

准备观察乱序机器

从队头开始发射。请把 ROB 想成取餐号: 后面的餐可以先做好, 但交给顾客必须按号。

cycle 0 · init
compact timelineframe 1/16
annotation/observe
beginner mental model
STEP 1
前台派单

指令拿到 ROB 小票, 再去对应工位。

STEP 2
工位加工

原料没到就等; 原料到齐就可以先做。

STEP 3
广播喇叭

做好的结果喊给所有等待者。

STEP 4
按号交付

不管谁先做好, 只从 ROB 队头交付。

1 · 前台派单队列program order
I1WAITING
LD F2, 0(R1)

先从仓库拿到原料 F2

I2WAITING
MUL F4, F2, F0

慢工位: 用 F2 做乘法

I3WAITING
ADD F6, F4, F8

等乘法结果后再相加

I4WAITING
ADD F10, F2, F8

另一条加法可提前完成

2 · Reservation Stations工位拿到原料就开工
取货工位FREE
空闲no ticket
left
-
right
-

可接下一张小票

加法工位 AFREE
空闲no ticket
left
-
right
-

可接下一张小票

加法工位 BFREE
空闲no ticket
left
-
right
-

可接下一张小票

乘法工位FREE
空闲no ticket
left
-
right
-

可接下一张小票

3 · CDB 广播喇叭IDLE
Common Data Bus
静默

结果不是悄悄交给一个人,而是广播给 ROB 和所有等待这个小票的工位。

4 · Reorder Buffer按小票顺序交付
ROB1EMPTY

空小票

ROB2EMPTY

空小票

ROB3EMPTY

空小票

ROB4EMPTY

空小票

BRANCH PREDICTION LAB
预测
Taken
实际
Taken
loop back

预测正确,流水线继续填充,无气泡。

为什么

循环回边高度偏 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”仍是抽象词。 新版把它们落到四个稳定物件: 队列、工位、广播、取餐号。