Skip to content

2016年 408 计算机组成原理 第 19 题

计算机组成原理2016年选择题2分

题目

在无转发机制的五段基本流水线中,下列指令序列存在数据冒险的指令对是( )。

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, R3R1R2, R3
I2: add R5, R2, R4R5R2, R4
I3: add R4, R5, R3R4R5, R3
I4: add R5, R2, R6R5R2, 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):

指令 \ 周期12345678I1IFIDEXMEMWBI2IFIDEXMEMWBI3IFIDEXMEMWBI4IFIDEXMEMWB

观察 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 或转发处理的真正数据冒险

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数