定义
流水线冒险(Pipeline Hazard)是指由于指令之间的相关性或资源冲突,导致流水线无法按理想状态连续执行的情况。
结构冒险(资源冲突)
多条指令在同一时钟周期争用同一功能部件。解决方法:资源复制、流水线停顿。
数据冒险
- RAW(Read After Write):后一条指令读取前一条指令尚未写入的数据
- WAR(Write After Read):后一条指令写入前一条指令尚未读取的数据
- WAW(Write After Write):两条指令写入同一位置
解决方法:数据前推(Forwarding)、流水线停顿、编译器调度。
控制冒险
主要由转移指令(分支、跳转、调用)引起,导致下一条指令地址不确定。
解决方法:
- 分支预测(静态/动态)
- 延迟分支
- 刷新流水线