首页/计算机组成原理/中央处理器/控制冒险处理 🔗 在 Obsidian 中打开
计算机组成原理 · 中央处理器

控制冒险处理

重要度 ⭐⭐⭐⭐⭐中央处理器流水线控制冒险分支预测CPU
速查
控制冒险发生在分支指令改变 PC 时:分支结果常在 EX / MEM 阶段才确定,但流水线在 ID 阶段已取后续指令,若跳转则需冲刷(Flush)。解法:停顿、静态预测、动态预测(BHT)、延迟分支。

速查

项目
定义分支指令改变 PC 值,导致已取指令可能无效
别名控制冲突、分支冒险
产生原因分支结果在流水线后期才确定
最简单解法插入 1~2 个停顿周期(冻结流水线)
最优解法分支预测 + 推测执行
分支代价预测错误时需冲刷已执行的指令

核心概念

什么是控制冒险?

控制冒险发生在分支指令(条件跳转 / 函数调用 / 返回)改变程序执行顺序时。

分支指令的目标地址和是否跳转通常在 EX 阶段或 MEM 阶段才确定,但流水线在 ID 阶段就已经取了后续指令。如果分支跳转了,已取的指令是错误的 → 需要冲刷(Flush)

示例
BEQ R1, R2, target   // 分支指令
ADD ...               // IF: 已取,但分支跳转 → 指令无效!
SUB ...               // IF: 已取,同样无效
target: OR ...

解决方法

1. 插入停顿(最简单)

  • 等待分支结果确定后再取指
  • 代价:1~2 个周期(取决于分支在哪个阶段确定)
  • 效率低,但最安全

2. 预测分支不跳转(Predict Not Taken)

  • 假设分支不跳转,继续顺序取指
  • 预测正确 → 无代价
  • 预测错误 → 冲刷已取指令,重新取
  • 简单但准确率不高(循环通常跳转)

3. 预测分支跳转(Predict Taken)

  • 假设分支跳转,直接取目标地址的指令
  • 需要早期计算目标地址
  • 适合循环(循环大多数时候跳转回循环头)

4. 动态分支预测(Dynamic Prediction)

分支历史表(BHT)记录分支的历史行为:

  • 1 位预测器:上次跳转 → 预测跳转
  • 2 位预测器:需要连续两次预测错误才改变预测方向
    • 强跳转 / 弱跳转 / 弱不跳转 / 强不跳转
    • 准确率更高

5. 延迟分支(Delayed Branch)

  • 将分支指令后面的延迟槽中的指令无论是否跳转都执行
  • 编译器在延迟槽中填入有用的指令
  • 延迟槽大小通常为 1 条指令

关键性质

解决方法代价准确率硬件复杂度
停顿1~2 周期100%
预测不跳转预测错时冲刷~50%
预测跳转预测错时冲刷~50%
1 位动态预测预测错时冲刷~85%
2 位动态预测预测错时冲刷~90%
延迟分支低(需编译器配合)

常见考法

解题套路重点考 2 位预测器的状态转移、停顿周期计算、分支代价 = 预测错误率 $\times$ 冲刷周期数。
考法解题套路
识别控制冒险分支 / 跳转指令后紧跟的指令
计算停顿周期分支确定阶段 − IF 阶段 = 停顿周期数
2 位预测器状态转移根据历史预测和实际结果更新状态
分支代价计算预测错概率 $\times$ 冲刷周期数
延迟分支分析延迟槽中的指令总是被执行

易错点

必记
  1. 控制冒险只由分支 / 跳转指令引起,顺序执行无控制冒险。
  2. 分支预测错误时需要冲刷(不是停顿),代价更大。
  3. 2 位预测器比 1 位好是因为不会因一次错误就改变预测方向。
  4. 延迟槽中的指令总是被执行,无论分支是否跳转。
  5. 分支目标在 ID 阶段确定 → 停 1 周期;在 EX 阶段确定 → 停 2 周期。

核心结论

  1. 控制冒险由分支指令引起,已取的后续指令可能无效。
  2. 解决方法:停顿、静态预测、动态预测、延迟分支。
  3. 2 位动态预测器准确率最高(~90%),是考试重点。
  4. 分支预测错误 → 冲刷流水线 → 代价 = 预测错误率 $\times$ 冲刷周期。
  5. 延迟分支由编译器配合,在延迟槽中填充有用指令。

记忆卡片

控制冒险的产生原因?
分支指令改变 PC,已取的后续指令可能无效。
2 位预测器的优势?
不会因一次预测错误就改变方向,准确率更高。
延迟分支是什么?
分支后的延迟槽指令总是被执行,编译器调度有用指令。
预测错误的代价?
冲刷已进入流水线的错误指令。
分支代价取决于什么?
分支结果确定的阶段(越晚确定代价越大)。

交互动画 · 2 位分支预测器状态机

2 位饱和计数器:需连续两次错误才翻转预测。点击"实际跳转 / 不跳转"观察状态转移与当前预测方向。

手动模式
强不跳SN 弱不跳WN 弱跳转WT 强跳转ST 当前预测:不跳转 初始状态:强不跳转(SN)
提示:状态在 {强不跳, 弱不跳} 时预测"不跳转",在 {弱跳, 强跳} 时预测"跳转"。
——
每次实际分支结果使状态向相应方向移动一格;预测失误时需冲刷已取指令,会增加流水线代价。

相关知识点

structural-hazard-handling data-hazard-handling instruction-pipeline

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。