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 冒险,流水线会读到一个错误的旧值,导致计算结果不正确。这就是为什么流水线控制逻辑必须检测并处理这些数据冒险。

相关笔记

链接到