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