题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 指令之前插入一条空操作指令, 这样在 add 指令的 EX 段就可从 MEM/WB 流水段寄存器中取出 load 指令的最新结果。