4.16 控制冒险
定义
控制冒险(Control Hazard)是由控制流指令(分支、跳转、调用、返回)引起的流水线冒险。流水线取指阶段需要预测下一条指令的地址,但预测可能错误,导致流水线中已取指的指令无效。
条件跳转预测错误
Y86-64 采用”总是预测跳转”的策略。当条件跳转实际不满足时:
- 执行阶段判断条件码后确认分支未选择
- 正确的下一条指令地址是 valP(顺序下一条)
- 已经取指进入流水线的 2 条指令需要被取消
- 流水线中插入 2 个气泡
气泡的插入方式是将 E 寄存器和 M 寄存器中的控制信号置为 nop,使得这些阶段的指令不产生任何副作用。
ret 指令的冒险
ret 指令的特殊之处在于返回地址完全无法预测——在取指阶段,处理器不知道 ret 将返回到哪个地址。
ret 的流水线行为:
周期1: [取指 ret] [译码 ret] [执行 ret] [访存 ret] [写回 ret]
↑ 这里才从内存读到返回地址
周期2: [气泡] [取指] [译码] [执行] [访存]
周期3: [气泡] [气泡] [取指] [译码] [执行]
周期4: [下一指令] [取指] [译码] [执行] [访存]
ret 导致 3 个气泡。
处理控制冒险的统一框架
控制冒险可以通过暂停取指阶段并插入气泡来处理:
- 当取指阶段遇到无法预测的指令(如 ret),暂停取指直到获得正确地址
- 执行阶段或访存阶段获得真实目标地址后,纠正 PC 并刷新流水线中错误取指的指令
- 气泡自动插入以填充清空后的流水线阶段
分支预测的改进
更先进的分支预测技术包括:
- 分支历史表(Branch History Table, BHT):记录分支的历史跳转模式
- 两级自适应预测器:利用全局/局部历史模式预测
- 分支目标缓冲(Branch Target Buffer, BTB):缓存分支目标地址
这些技术在现代超标量处理器中广泛使用,可以将预测准确率提升至 95% 以上。
相关笔记
链接到
- 上一个知识点:4.15 加载使用冒险
- 下一个知识点:4.17 异常处理与流水线