4.12 数据相关与冒险
数据相关
数据相关(Data Dependency)是流水线处理器中相邻或相近指令之间的数据依赖关系。当一条指令需要使用前一条指令的计算结果时,就产生了数据相关。
冒险的三种类型
RAW(写后读)—— 真正的依赖
后一条指令读一个寄存器,而该寄存器正被前一条指令(尚未写回)写入。这是流水线中最常见、最需要解决的问题。
addq %rax, %rbx ← 写 %rbx
subq %rcx, %rbx ← 读 %rbx(需要 addq 的结果)
WAW(写后写)
两条指令写同一个寄存器,但后一条先完成写回。在 Y86-64 的五级流水线中,由于写回阶段只有一个且按序执行,WAW 不会发生。
WAR(读后写)
后一条指令写一个寄存器,而前一条指令尚未读取该寄存器的旧值。在 Y86-64 中,译码阶段(读取寄存器)总是早于执行/访存阶段(产生新值),因此 WAR 也不会发生。
三类冒险的实际意义
| 冒险类型 | 在Y86-64流水线中 | 典型解决方案 |
|---|---|---|
| RAW | 频繁发生 | 数据转发 + 暂停 |
| WAW | 不发生(写回阶段唯一且有序) | 无需处理 |
| WAR | 不发生(读早于写) | 无需处理 |
因此,Y86-64 流水线只需要关注 RAW 冒险即可。
冒险的后果
如果不处理 RAW 冒险,流水线会读到一个错误的旧值,导致计算结果不正确。这就是为什么流水线控制逻辑必须检测并处理这些数据冒险。