| 冒险 | 成因 | 解决 |
|---|---|---|
| 数据冒险 | RAW (课内主要) WAR WAW |
流水线气泡(硬阻塞) Noop(软阻塞) 旁路转发 静态调度 |
| 结构冒险 | 同一周期同一部件收到多个指令访问 | 增加硬件资源 哈佛架构 |
| 控制冒险 | 下一条指令未知,两种可能 | 分支预测 分支延迟 软硬件阻塞 |
数据冒险
成因
- 读后写 WAR
- 写后读 RAW ID 时还没 WB
- 写后写 WAW
解决
- 硬件
- 流水线气泡 Stalling/Bubbling
- 被依赖のWB 下一周期才能 依赖のID!!
I1:IF$\to$ID$\to$EX$\to$MEM$\to$WBI2:IF$\to$ 空 $\to$ 空 $\to$ 空 $\to$ID$\to$ …
- 被依赖のWB 下一周期才能 依赖のID!!
- 数据转发/旁路 Forwarding/Bypassing 只能转发 ALU result 自返回到操作数解决RAW 读后写冒险中的数据依赖问题,无法解决 load-use 数据冒险
- 流水线气泡 Stalling/Bubbling
load-use 数据冒险
属于 RAW 读后写冒险,意为 load 后紧跟 use (比如 add) 五级流水线结构中,load 指令流程如下:
- IF:取指
- ID:解析操作数和寻址方式
- EX: 计算寻址结果 (例如基址寻址要计算基址 + 偏移量)
- MEM:从 EX 结果寻址取数据
- WB:写回数据
根本上讲
- data-dependence $\implies$ 被依赖数据由 EX 产生
- load-use $\implies$ 被依赖数据由 MEM 产生
Bypassing 只能解决 EX 结果返回到 EX 操作数の问题
如果 load 后紧跟 use,会导致 use 的 EX 阶段 load 还在 MEM 阶段,被依赖数据仍未产生. 所以 Bypassing 无法解决
- 软件
- 插入 Noop
- 编译调动指令顺序 (静态调度)
结构冒险
成因
同一周期内,同一部件收到多条指令访问
解决
- 增加硬件资源
- 采用哈佛架构,分为指令缓存 i-cache & 数据缓存 d-cache
控制冒险
成因
分支条件计算完成前,后续执行指令未知,流水线无法进行
解决
- 分支预测
- 分支延迟
- 软硬件阻塞
- stalling/bubbling
- 软件插入 noop