Appearance
题目
在无转发机制的五段基本流水线中,下列指令序列存在数据冒险的指令对是( )。
I1: add R1, R2, R3; // (R2)+(R3)→R1
I2: add R5, R2, R4; // (R2)+(R4)→R5
I3: add R4, R5, R3; // (R5)+(R3)→R4
I4: add R5, R2, R6; // (R2)+(R6)→R5错因
A
I1 和 I2 都"用了 R2",但 I1 是 (R2)+(R3)→R1、I2 是 (R2)+(R4)→R5——两条都是读 R2,没有谁写 R2。"两条都读同一寄存器"叫 RAR(读后读),不会冲突,因为读不会改变寄存器的值。只有一方写、另一方读才构成数据冒险。
C
I2 写 R5、I4 也写 R5,这是 WAW(写后写)。考生把 WAW 当成了数据冒险,但 408 选择题里"数据冒险"通常专指 RAW(写后读)。在五段顺序流水线里,WAW 由于"按程序顺序进入 WB 阶段"自然有序写回,不会出错。WAR(读后写)同理也不构成问题——五段流水里 ID 阶段读发生在 WB 阶段写之前,顺序天然满足。
D
I3 和 I4 没有真正的"前者写、后者读"对应关系:
- I3 写 R4 → I4 读的是 {R2, R6},没有 R4
- I4 写 R5 → 但 I3 在 I4 之前,I3 不可能"读 I4 还没写出来的 R5"(I3 读的 R5 来自更早的 I2)
挑选 D 的人多半是看到"R5"在两条里都出现就直觉判定,没区分"读"和"写"的具体方向。
总解析
第一步:列出每条指令的"写"和"读"寄存器
| 指令 | 写 | 读 |
|---|---|---|
I1: add R1, R2, R3 | R1 | R2, R3 |
I2: add R5, R2, R4 | R5 | R2, R4 |
I3: add R4, R5, R3 | R4 | R5, R3 |
I4: add R5, R2, R6 | R5 | R2, R6 |
第二步:逐对找 RAW(前者写、后者读同一寄存器)
- I1 写 R1:后续 I2、I3、I4 都不读 R1 → ✗
- I2 写 R5:I3 读 R5 → ✓ 命中,存在 RAW 数据冒险
- I3 写 R4:I4 读 {R2, R6},无 R4 → ✗
- I4 写 R5:后续无指令 → ✗
只有 I2-I3 一对存在 RAW 依赖。
第三步:从时空图直观看 I2-I3 的冲突
按"理想推进"画时空图(暂不画 stall):
观察 R5 的生产者 I2 和消费者 I3:
- I2 在 第 6 周期 才到 WB 阶段(写回新 R5)
- I3 在 第 4 周期 就在 ID 阶段读寄存器了
I3 读 R5 的时刻(第 4 周期)早于 I2 写 R5 的时刻(第 6 周期)——读到的是 R5 的旧值,结果错误。这就是"无转发情况下,I2-I3 之间必须插入 stall 来等待"的原因。
最终答案是 B(I2 和 I3)。
判定口诀:
408 选择题里的"数据冒险" = RAW(写后读)。逐对检查"前者写哪个寄存器、后者是否读它"即可——
- 读后读(RAR):两条都只读,无冲突
- 写后写(WAW)/ 读后写(WAR):在五段顺序流水线里自然有序解决,不算数据冒险
- 写后读(RAW):唯一需要 stall 或转发处理的真正数据冒险