计算机组织与系统结构第七章习题答案

7. 假定以下MIPS指令序列在图7.18所示的流水线数据通路中执行:

addu

subu add

$s3, $s1, $s0 $t2, $s0, $s3 $t3, $t1, $t2

lw $t1, 0($t2) add $t1, $s4, $s5

请问:(1)上述指令序列中,哪些指令的哪个寄存器需要转发,转发到何处? (2)上述指令序列中,是否存在load-use数据冒险?

(3)第5周期结束时,各指令执行状态是什么?哪些寄存器的数据正被读出?哪些寄存器

将被写入? 参考答案:

(1)发生数据相关的有:第1和2间关于$s3、第2和3间关于$t2、第2和4间关于$t2、

第3和4间关于$t1。通过“转发”可以避免1和2、2和3、2和4间的数据相关; (2)第3和4间是load-use数据相关,所以无法用“转发”消除冒险。 (3)第五个时钟内各条指令的执行情况如下:

指令1在“WB”阶段,控制信息等在MEM/WB.Reg中,$s3正在被写,结束时写完 指令2在“MEM”阶段,控制信息等在EX/MEM.Reg中。sub指令在该阶段进行的是空操作;在转发检测单元中,因为流水段寄存器Ex/Mem中的目的寄存器RegRd为$t2,流水段寄存器ID/Ex中的源寄存器Rs也为$t2,同时,流水段寄存器Ex/Mem中的RegWr控制信号为1,所以检测到转发条件满足,因而,此时,sub指令在上一个时钟周期中的执行结果(在流水段寄存器Ex/Mem中的ALU输出结果)正被回送到ALU的输入端;结束时转发完成

指令3在“EXE”阶段,ALU正在执行“add”操作,进行地址运算,ALU输出结果将被写入流水段寄存器Ex/Mem中;结束时运算完成。控制信息等在ID/EX.Reg中,正在检测是否loaduse冒险

指令4在“ID/REG”阶段,指令在IF/ID.Reg中,$t1和$t2正在被读出。在load-use冒险检测单元中,因为流水段寄存器IF/ID中源操作数寄存器Rs为$t1,流水段寄存器ID/Ex中目的操作数寄存器Rt也为$t1,同时,因为上条指令是lw,故流水段寄存器ID/Ex中的MemRead控制信号为1,所以在该阶段检测到load-use冒险条件满足,此时,需要进行load-use冒险处理,在流水线中插入一个“气泡”,将指令的执行阻塞一个时钟周期。包括以下三个步骤:① 将流水段寄存器ID/Ex中的控制信号全部清0,以保证第4条指令被阻塞一个时钟周期执行;② 将流水段寄存器IF/ID中的指令维持不变,以保证第4条指令重新译码后执行;③ 将PC的值维持不变,以保证根据PC的值重新取出第5条指令。结束时完成上述工作。

指令5在“IF”阶段,指令正被读出。结束时已送到流水段寄存器IF/ID的输入端。因为之前发生了load-use数据冒险,所以该指令将在随后的第6个时钟周期内重新被读出。

? 160 ?

8. 假定有一个程序的指令序列为“lw, add, lw, add, …”。add指令仅依赖它前面的lw指令,而lw指令也仅依赖它前面的add指令,寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内独立工作。请问:(1)在带转发的五段流水线中执行该程序,其CPI为多少?

(2)在不带转发的五段流水线中执行该程序,其CPI为多少?

参考答案:(1)因为lw指令和add指令之间存在一个load- use数据冒险,所以每个lw指令和add指令之间要有一次流水线阻塞。而add指令和lw指令之间的数据冒险可通过数据转发解决。即:CPI为1.5

(2)如果没有转发,而寄存器写口和寄存器读口分别在一个时钟周期的前、后半个周期内工作,则在每条lw指令和add指令之间将会有两个阻塞,这样每条指令相当于都要有三个时钟才能完成。即:CPI为3

? 161 ?

9. 假定在一个带转发功能的五段流水线中执行以下程序段,则可以怎样调整以下指令序列使其性能达到最好?

参考答案:

1 2 3 4 5 6 7

因为采用“转发”技术,所以,只要对load-use数据冒险进行指令序列调整。从上述指令序列来看,第1和第2条指令、第6和第7条指令之间存在load-use数据冒险,所以,可将与第2和第3条指令无关的第4条指令插入第2条指令之前;将无关的第5条指令插入第7条指令之前。调整顺序后的指令序列如下(粗体部分为变换了位置的指令)。

lw $2, 100($6) add $6, $4, $7 add $2, $2, $3 lw $3, 200($7) lw $2, 300($8) sub $3, $4, $6 beq $2, $8, Loop

lw $2, 100($6) add $2, $2, $3 lw $3, 200($7) add $6, $4, $7 sub $3, $4, $6 lw $2, 300($8) beq $2, $8, Loop

? 162 ?

10. 在一个采用“取指、译码/取数、执行、访存、写回”的五段流水线中,若检测结果是否为“零”的操作在执行阶段进行,则分支延迟损失时间片(即分支延迟槽)为多少?以下一段MIPS指令序列中,在考虑数据转发的情况下,哪些指令执行时会发生流水线阻塞?各需要阻塞几个时钟周期? 1 loop:

2

3 4 5 6 7 8

add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s6 lw $t0, 0($t1) bne $t0, $s5, exit add $s3, $s3, $s4 j

loop

exit:

参考答案:

若检测操作在执行阶段进行,则分支延迟损失时间片(即分支延迟槽)为2。

分析:发生数据相关的是:第1和第2条指令之间关于$t1,第2和第3条指令之间关于$t1,第3和第4条指令之间关于$t1,第4和第5条指令之间关于$t0,以及第6和第1条指令之间关于$s3。此外,第5和第7条指令的执行都会发生控制相关。

对于数据冒险,如果不采用“转发”,而是简单地通过加入nop指令来避免冒险的话,那么应该在第2、3、4、5条指令前各加两条nop指令,以消除数据相关;对于第6条和第1条指令之间的数据相关,则可通过在第7条“j loop”指令后面加一条或两条nop指令消除(这样同时还能解决第7条“j loop”指令的控制冒险);

此处,第2、3、4条指令所需的操作数可通过“转发”得到,无需加nop指令。第5条bne指令所需的操作数$t0是load-use冒险,不能用“转发”解决问题,需要在第5条指令前加一条nop指令,或通过硬件将第5条指令的执行阻塞一个时钟周期。

j指令如果在译码阶段就根据译码结果计算跳转目标地址,那么j指令后面指令会被阻塞1个时钟周期,若在执行阶段计算,则要阻塞2个时钟周期。

? 163 ?

联系客服:779662525#qq.com(#替换为@)