下面是一段MIPS指令序列:add$t1,$s1,$s0 #R[$t1]←R[$s1]+R[$s0]sub$t2,Ss0,$s3 #R[$t2]←R[$s0]-R[$s3]add$t1,St1,$t2 #R[$t1]←R[$t1]+R[$t2] 假定在一个采用“取指、译码/取数、执行、访存、写回”的五段流水线处理器中执行上述指令序列,请回答下列问题:
问答题 以上指令序列中,哪些指令之间发生数据相关?
【正确答案】正确答案:因为第1条和第3条指令都会更新第3条指令用到的寄存器的值,有可能导致第3条指令取操作数时得到的是更新前的数据,这样,第3条指令就不能正确执行,所以,第1条和第3条指令、第2条和第3条指令之间发生数据相关。
【答案解析】
问答题 若不采用“转发”技术的话,需要在何处、加入几条nop指令能保证这段指令序列的执行避免数据冒险。
【正确答案】正确答案:不采用“转发”技术的话,就只能通过在第3条指令前加nop指令来延迟第3条指令的执行。因为只有第2条指令把数据写回到寄存器$t2后(因第1条指令比第2条早完成,故此时第一条指令已经把数据写回到寄存器$t1中),第3条指令才能从$t2取到正确的值,所以第2条指令的“写回”流水段后面才应该是第3条指令的“译码/取数”流水段,为此,在第2条和第3条指令之间必须插入3条nop指令,见表8-8。
【答案解析】
问答题 如果采用“转发”技术,是否可以完全解决数据冒险?若不行,需要在何处,加入几条nop指令,才能使这段指令序列的执行避免数据冒险。
【正确答案】正确答案:采用“转发”技术,上述程序段可以完全避免数据冒险。只要把第1条指令“访存”段结束时在流水线寄存器中的$t1的值和第2条指令“执行”段结束时在流水段寄存器中的$t2的值同时“转发”到第3条指令的“执行”段内的ALU的两个输入端,这样,在ALU中运算的两个操作数都是正确的值,不会发生数据冒险,无需再插入nop指令,见表8-9。
【答案解析】
问答题 在2)和3)两种情况下,执行上述3条指令的CPl分别是多少?(保留小数点后一位)
【正确答案】正确答案:在2)的情况下,不采用“转发”技术来执行上述3条指令,则需要的时钟周期数为10,故CPI为10/3=3.3。 在4)的情况下,采用“转发”技术来执行上述3条指令,则需要的时钟周期数为7,故CPI为7/3=2.3。
【答案解析】