题13

题目

Q:下列指令序列中, 指令 I1 和 I3、I2 和 I3 之间发生数据相关。
假定采用 “取指、译码/取数、执行、访存、写回” 五段流水线方式, 那么在采用转发技术时, 需要在指令 I3 之前加入( )条空操作指令才能使这段程序不发生数据冒险。

I1: add r1, r0, 1 # (r1) ← (r0) + 1
I2: loa r3, 12(r2) # (r3) ← M[(r2) + 12]
I3: add r5, r3, r1 # (r5) ← (r3) + (r1)

A. 3
B. 2
C. 0
D. 1

分析

A:load-use 冒险: 当 use 指令需要使用 load 指令从内存中读取的数据时,如果 load 指令还没有完成内存读取,就会产生 load-use 冒险

D
转发技术可以解决部分数据冒险, 但不能解决 load-use 类型的数据冒险。
分析上述指令序列, 指令 I1 在 EX 段结束时已得到 r1 的新值,采用转发技术后,指令 I3 在 ALU 中用到的 r1 值可以直接从 EX/MEM 流水段寄存器中取, 可以解决指令 I1 和 I3 的数据冒险。
指令 I2 和 I3 是 load-use 类型的数据冒险, load 指令只在 MEM 段结束时才能取到主存中的数据, 然后送 MEM/WB 流水段寄存器,在 WB 段的前半个周期才能将新值写入 ,但随后的 add 指令在 EX 阶段就要取 的值, 因此会发生数据冒险。
需要在 add 指令之前插入一条空操作指令, 这样在 add 指令的 EX 段就可从 MEM/WB 流水段寄存器中取出 load 指令的最新结果。