【正确答案】因为第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 |
|
|
|
|
取指 |
译码/取数 |
执行 |
访存 |
写回 |
|