首页/计算机组成原理/中央处理器/流水线冒险详解 🔗 在 Obsidian 中打开
计算机组成原理 · 中央处理器

流水线冒险详解

重要度 ⭐⭐⭐⭐⭐中央处理器408CPU
速查
流水线冒险(Hazard)= 无法在下一拍执行下一条指令。三类:结构(资源冲突)、数据(数据依赖,最常见 RAW)、控制(分支不确定)。对应解法:资源复制 / 前递+停顿 / 预测+延迟分支。

速查

冒险类型本质
数据冒险后续指令需要前序指令的结果
控制冒险分支指令改变执行流
结构冒险硬件资源冲突

基本概念

流水线冒险(Hazard)指流水线中无法在下一个时钟周期执行下一条指令的情况。出现冒险时,处理器通常通过插入气泡(bubble / stall)冲刷(flush)来化解,这会降低流水线的实际吞吐率。

三类冒险总览结构冒险与资源有关;数据冒险与指令间的数据依赖有关;控制冒险与指令流的改变(分支)有关。三者都会打断"每拍流出一条指令"的理想节奏。

一、结构冒险(Structural Hazard)

定义

多条指令同时需要同一硬件资源(如同一个存储器端口、同一个乘法器)。

典型场景

  • 指令和数据共用一个存储器端口(IF 取指 与 MEM 访存 冲突);
  • 只有一个乘法器,两条乘法指令并行执行。

解决方法

  1. 资源复制:分离指令 Cache 和数据 Cache(哈佛结构);
  2. 流水线停顿:插入气泡(bubble / stall)错开资源使用。

二、数据冒险(Data Hazard)

定义

指令之间存在数据依赖关系,后续指令需要前面指令的结果。

三种依赖类型

类型含义示例
RAW(写后读)真数据相关ADD R1,...SUB ...,R1,...
WAW(写后写)输出相关两条指令写同一寄存器
WAR(读后写)反相关读后被覆盖(顺序流不存在)
最常见的是 RAW流水线中最常出现、也最值得重点掌握的是 RAW 冒险(写后读的真数据相关)。

解决方法

1. 插入气泡(Stall)

停顿 1~2 个周期等待数据就绪。性能损失大。

2. 数据前递 / 旁路(Forwarding / Bypassing)

将 ALU 的计算结果直接转发到下一条指令的 ALU 输入端,而不等写回寄存器。

ADD R1, R2, R3    ; EX 阶段产生结果
SUB R4, R1, R5    ; 需要 R1 → 通过前递直接拿到

3. 编译器调度

重排指令顺序,避免紧邻的数据依赖。

4. 前递 + 停顿组合(Load-Use)

Load-Use 必须 stall 1 拍Load 的数据在 MEM 阶段末尾才从存储器读出,而下一条指令在 EX 阶段就需要它,前递来不及,因此必须停顿 1 个周期。
LW  R1, 0(R2)     ; 数据在 MEM 末尾才出
ADD R3, R1, R4    ; EX 阶段就需要 → 必须 stall 1 周期

三、控制冒险(Control Hazard)

定义

分支指令的结果在后续阶段才确定,导致已进入流水线的指令可能是错误的(须冲刷)。

解决方法

  1. 等待(Stall):等分支结果确定后再取指。性能最差。
  2. 预测不跳转(Predict Not Taken):假设不跳转,继续取下一条;猜错则冲刷。
  3. 预测跳转(Predict Taken):假设跳转,直接取目标地址指令。
  4. 延迟分支(Delayed Branch):分支后的延迟槽(delay slot)中的指令总是执行,编译器填入有用指令。
  5. 动态分支预测
    • 1-bit 预测器:上次跳转则预测跳转;
    • 2-bit 预测器:需连续两次预测错才改变预测方向;
    • BTB(分支目标缓冲):缓存分支目标地址。
预测的代价一旦预测错误,已流入流水线的指令必须冲刷,损失与流水线深度成正比。2-bit 预测器优于 1-bit 的关键在于:偶然的分支行为抖动不会立即翻转预测方向。

冒险总结

冒险类型原因核心解决方法
结构冒险资源冲突资源复制
数据冒险数据依赖前递 + 偶尔 stall
控制冒险分支不确定预测 + 延迟分支

交互动画 · 三类冒险对照

记忆卡片

三种流水线冒险分别是什么?
结构冒险(资源冲突)、数据冒险(数据依赖)、控制冒险(分支不确定)。
前递(Forwarding)解决什么冒险?
数据冒险。将结果直接从产生阶段送到需要阶段。
为什么 Load-Use 冒险必须 stall?
数据在 MEM 阶段末尾才从存储器读出,而下一条指令 EX 阶段就需要,无法前递。
2-bit 动态预测器比 1-bit 好在哪里?
偶然的分支行为变化不会立即改变预测方向,减少预测错误率。

相关知识点

指令流水线 流水线性能分析 异常与中断处理

提示:本文承接「流水线执行过程手算」「指令流水线」,并为「流水线性能分析」奠定冒险与停顿的基础。