4.16 控制冒险

定义

控制冒险(Control Hazard)是由控制流指令(分支、跳转、调用、返回)引起的流水线冒险。流水线取指阶段需要预测下一条指令的地址,但预测可能错误,导致流水线中已取指的指令无效。

条件跳转预测错误

Y86-64 采用”总是预测跳转”的策略。当条件跳转实际不满足时:

  1. 执行阶段判断条件码后确认分支未选择
  2. 正确的下一条指令地址是 valP(顺序下一条)
  3. 已经取指进入流水线的 2 条指令需要被取消
  4. 流水线中插入 2 个气泡

气泡的插入方式是将 E 寄存器和 M 寄存器中的控制信号置为 nop,使得这些阶段的指令不产生任何副作用。

ret 指令的冒险

ret 指令的特殊之处在于返回地址完全无法预测——在取指阶段,处理器不知道 ret 将返回到哪个地址。

ret 的流水线行为:

周期1: [取指 ret] [译码 ret] [执行 ret] [访存 ret] [写回 ret]
                                            ↑ 这里才从内存读到返回地址
周期2: [气泡]     [取指]     [译码]     [执行]     [访存]
周期3: [气泡]     [气泡]     [取指]     [译码]     [执行]
周期4: [下一指令]  [取指]     [译码]     [执行]     [访存]

ret 导致 3 个气泡。

处理控制冒险的统一框架

控制冒险可以通过暂停取指阶段插入气泡来处理:

  1. 当取指阶段遇到无法预测的指令(如 ret),暂停取指直到获得正确地址
  2. 执行阶段或访存阶段获得真实目标地址后,纠正 PC 并刷新流水线中错误取指的指令
  3. 气泡自动插入以填充清空后的流水线阶段

分支预测的改进

更先进的分支预测技术包括:

  • 分支历史表(Branch History Table, BHT):记录分支的历史跳转模式
  • 两级自适应预测器:利用全局/局部历史模式预测
  • 分支目标缓冲(Branch Target Buffer, BTB):缓存分支目标地址

这些技术在现代超标量处理器中广泛使用,可以将预测准确率提升至 95% 以上。

相关笔记

链接到