问答题 下面是一段MIPS指令序列:
1 add $t1, $s1, $s0 #R[$t1]←R[$s1]+R[$s0]
2 sub $t2, $s0, $t1 #R[$t2]←R[$s0]-R[$t1]
3 add $t3, $t3, $s2 #R[$t1]←R[$t1]+R[$t2]
4 1w $t4,100($s3) #R[$t4]←M[R[$s3]+100]
“取指、译码/取数、执行、访存、写回”的五段流水线处理器中执行上述指令序列,请回答下列问题:
问答题 以上指令序列中,哪些指令之间发生数据相关。
【正确答案】因为第1条会更新第2指令用到的寄存器的值,有可能导致第2指令取操作数时得到的是更新前的数据,这样,第2指令就不能正确执行,所以,第1条和第2指令之间发生数据相关。
【答案解析】
问答题 若不采取“转发”技术的话,怎样调整这些指令的顺序才能使其性能最好,这时还需在何处,加入几条nop指令才能保证调整后的这段指令序列的执行避免数据冒险。此时,CPI为多少?
【正确答案】因为第3条、第4条都没有用到第2条更新的值,且第3、4条也未使用第1条指令更新的值,故可以把顺序调整为:
1 add $t1, $s1, $s0 #$[$t1]←R[$s1]+R[$s0]
2 add $t3, $t3, $s2 #[$t1]←R[$t1]+R[$t2]
3 1w $t4, 100 ($s3) #R[$t4]←M[R[$s3]+100]
4 sub $t2, $s0, $t1 #[$t2]←R[$s0]-R[$t1]
此时只有第1条指令把数据写回到寄存器$t1后,第4条指令才能从$t1取到正确的值。所以第1条指令的“写回”流水段后面才应该是第4条指令的“译码/取数”流水段,为此,在第3条和第4条指令之间必须插入1条nop指令,见下表。
采用上述方法来执行上述4条指令,则需要的时钟周期数为9,故CPI为9/4=2.5。
{{B}}在第3条和第4条指令之间插入1条nop指令{{/B}}
指令 1 2 3 4 5 6 7 8 9 10
1 取指 译码/取数 执行 访存 写回
2 取指 译码/取数 执行 访存 写回
3 取指 译码/取数 执行 访存 写回
nop
4 取指 译码/取数 执行 访存 写回
【答案解析】