问答题
下面是一段MIPS指令序列:
add $t1, $s1, $s0
#R[$t1]←R[$s1]+R[$s0]
sub $t2, $s0, $s3
#R[$t2]←R[$s0]-R[$s3]
add $t1, $t1, $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指令,见表1。
{{B}}表1 在第2条和第3条指令之间插入3条nop指令{{/B}}
|
| 指令 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| 1 |
取指 |
译码/取数 |
执行 |
访存 |
写回 |
|
|
|
|
|
| 2 |
|
取指 |
译码/取数 |
执行 |
访存 |
写回 |
|
|
|
|
| nop |
|
|
|
|
|
|
|
|
|
|
| nop |
|
|
|
|
|
|
|
|
|
|
| nop |
|
|
|
|
|
|
|
|
|
|
| 3 |
|
|
|
|
|
取指 |
译码/取数 |
执行 |
访存 |
写回 |
【答案解析】
问答题
如果采用“转发”技术,是否可以完全解决数据冒险?若不行,需要在何处,加入几条nop指令,才能使这段指令序列的执行避免数据冒险。
【正确答案】采用“转发”技术,上述程序段可以完全避免数据冒险。只要把第1条指令“访存”段结束时在流水线寄存器中的$t1的值和第2条指令“执行”段结束时在流水段寄存器中的$t2的值同时“转发”到第3条指令的“执行”段内的ALU的两个输入端,这样,在ALU中运算的两个操作数都是正确的值,不会发生数据冒险,无需再插入nop指令,见表2。
表2 不插入nop指令的指令序列
[*]
【答案解析】
问答题
在上面两种情况下,执行上述3条指令的CPI分别是多少?(保留小数点后一位)
【正确答案】在第二种情况下,不采用“转发”技术来执行上述3条指令,则需要的时钟周期数为10,故CPI为10/3=3.3。
在第四种的情况下,采用“转发”技术来执行上述3条指令,则需要的时钟周期数为7,故CPI为7/3=2.3。
【答案解析】