| 冒险类型 | 本质 |
|---|---|
| 数据冒险 | 后续指令需要前序指令的结果 |
| 控制冒险 | 分支指令改变执行流 |
| 结构冒险 | 硬件资源冲突 |
流水线冒险(Hazard)指流水线中无法在下一个时钟周期执行下一条指令的情况。出现冒险时,处理器通常通过插入气泡(bubble / stall)或冲刷(flush)来化解,这会降低流水线的实际吞吐率。
多条指令同时需要同一硬件资源(如同一个存储器端口、同一个乘法器)。
指令之间存在数据依赖关系,后续指令需要前面指令的结果。
| 类型 | 含义 | 示例 |
|---|---|---|
| RAW(写后读) | 真数据相关 | ADD R1,... 后 SUB ...,R1,... |
| WAW(写后写) | 输出相关 | 两条指令写同一寄存器 |
| WAR(读后写) | 反相关 | 读后被覆盖(顺序流不存在) |
停顿 1~2 个周期等待数据就绪。性能损失大。
将 ALU 的计算结果直接转发到下一条指令的 ALU 输入端,而不等写回寄存器。
ADD R1, R2, R3 ; EX 阶段产生结果
SUB R4, R1, R5 ; 需要 R1 → 通过前递直接拿到
重排指令顺序,避免紧邻的数据依赖。
LW R1, 0(R2) ; 数据在 MEM 末尾才出
ADD R3, R1, R4 ; EX 阶段就需要 → 必须 stall 1 周期
分支指令的结果在后续阶段才确定,导致已进入流水线的指令可能是错误的(须冲刷)。
| 冒险类型 | 原因 | 核心解决方法 |
|---|---|---|
| 结构冒险 | 资源冲突 | 资源复制 |
| 数据冒险 | 数据依赖 | 前递 + 偶尔 stall |
| 控制冒险 | 分支不确定 | 预测 + 延迟分支 |
提示:本文承接「流水线执行过程手算」「指令流水线」,并为「流水线性能分析」奠定冒险与停顿的基础。