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