Ch3.ILP
Dynamic Scheduling
把ID拆成2个阶段
- Issue(IS): 按顺序读指令, decode, 检测是否有结构冲突(使用相同部件,如加法器)。
- Read operand(RO): 等到没有数据冲突,就读操作数 (乱序执行
乱序执行会导致 WAR和WAW hazard (普通流水线中不会有问题,但是乱序之后会有。比如乱序先写后读)
总结

Toma:
- EX结束的时候的时间 = 操作数WB的时间+执行时间
- 不受部件限制,受保留站大小限制。(故t=2的时候第二条指令就IS了,不用等第一条执行完)
- Scoreboard在EX段乱序执行 而Tomasulo在RO段乱序
- 因为有寄存器重命名,所以WAR和WAW不需要等

ROB: 只需要加一列 顺序提交 commit(n)=max(WB(n)+1,commit(n-1)+1)

要看条件 填时间 / 可能会考某一个时刻的表状态。
Scoreboard

Integer是内存? 两个乘法器,因为乘法比较慢
Inst Status
√表示完成这个阶段
3,4在等待2的F2 5在等3,所以不能进入RO. 6的ADD和SUB都用到加法器,有结构冲突,所以不能进入IS
Func Comp Status& Reg Status
已经WB的不记录,只记录当前正在运行的。

- busy 代表当前这个单元是否有指令正在使用。op 表示这个单元正在被哪类指令使用。
- Fi 为目的,Fj、Fk 为源操作数
- Qj, Qk 代表源操作数来自哪个部件如 Mult1 的 Qj=Integer 说明来自整数部件(此时正在执行 Load 指令)
- Rj、Rk 代表源操作数的状态
- yes: operands is ready but no ready. 没读是因为在等其他操作数。比如mul f0,f2,f4的f4
- no & Qj=null: operand is read. 指令已经过了RO阶段,在EX或WB。比如第二条指令的R3
- no & Qj!=null: operand is not ready. 其他指令会修改这个操作数,而且还没有执行完毕。
Register Status: 每个寄存器要被哪个部件写

接下来 指令2WB了,指令3,4可以RO,EX。且加法比乘法快,所以指令4先WB, 这样指令6可以先执行,指令5还在等指令3
Mult和Add的指令已经在EX了,所以Rj=Rk=no,Qj=Qk=null

Tomasulo
每个部件前面有多个保留站(绿色),存储了要在这个部件上执行的指令,以及操作数的值。(这样避免WAR和WAW冒险,比如指令6要在指令5读R6之后才能写回)
IS: 从队列中 顺序 取出指令,并放入对应的保留站。进入保留站后,就会进行重命名,消除了 WAR 和 WAW 冒险
EX:
WB: 通过 CDB 总线将结果写回到寄存器的同时,将结果发到其他所有标记了的保留站里。(因此 CDB 也会影响 CPU 的效率,因此现在用多条总线保证效率)
Inst Status
跟scoreboard类似,IS、EX、WB三个阶段。只是为了理解算法,实际上硬件里没有。

Reservation Station Status
- Op
- Qj,Qk: 源操作数的值来自的保留站 (有依赖)
- Vj,Vk: 源操作数的值 (进入保留站时,把寄存器的值读出来并放到保留站中,这样其他指令写回就不影响了)
- Busy: 是否有指令占用
- A: Load/Store的目标地址
FLD F6, 34(R2)
FLD F2, 45(R3)
FMUL.D F0, F2, F4
FSUB.D F8, F2, F6
FDIV.D F10, F0, F60,,,,,
FADD.D F6, F8, F2
Load2(FLD F2, 45(R3) ) 只有地址
Add1(SUB F8,F2,F6) Vk是F6已经WB了,所以Vk的值是已知的。 而Vj需要等F2的结果,依赖Load2
Mult1 F2依赖Load2 F4已知
Mult2 进入保留站的时候F6已经读了出来并放在Vk中, F0依赖Mult1
当第二条指令执行完。SUB和ADD结束了,只有5 DIV在等3 MUL


在指令 5 进入保留站的时候,F6 的值已经读出来并且放到了保留站中,此时无论指令 6 什么时候执行完,写回 F6 的值,都不会影响指令 5 的操作数
Hardware-base speculation
在tomasulo后加一行
- WB阶段把结果写入ROB. ROB 是指令操作数的来源,就像 Tomasulo 算法中的保留站提供操作数一样
- Commit阶段把结果写入寄存器组。必须按顺序提交
| IS | EX | WB | Commit | |
|---|---|---|---|---|
| FLD F6,34,R2 | 1 | 2-3 | 4 | 5 |
| FLD F2,45,R3 | 2 | 3-4 | 5 | 6 |
| FMUL.D F0,F2,F4 | 3 | 6-15 | 16 | 17 |
| SUB F8,F6,F2 | 4 | 6-7 | 8 | 18 |
| DIV F10,F0,F6 | 5 | 17-56 | 57 | 58 |
| ADD F6,F8,F2 | 6 | 9-10 | 11 | 59 |
超标量和VLIW
见98笔记
分支预测
2-bit branch predictor
2-level predictor
(m,n) branch predictor: Branch predictor - Wikipedia
- 对于一条指令,维护他最近m次的历史分支结果(跳转/不跳转) (01串)
- 预测表: 包含\(2^m\)个条目, 每个条目是一个n位的状态机(如果n=2就是2-bit branch predictor)
- 利用历史分支结果 查预测表中的条目,根据状态机预测
为每条分支指令维护一个预测表代价太大。只维护一个表,用{ m位分支历史, 指令地址的低k位 }来索引, 每个条目同样是一个n位状态机。
预测表总bit数 = \(2^m\times n\times\) 指令地址选择的数量