可以在2个问题的处理器中使用转发吗?

时间:2019-01-10 16:45:15

标签: mips pipeline forwarding

计算机组织与设计,David A. Patterson和John L. Hennessy,第5版。第4章和第368页

4.18 在本练习中,我们比较1个问题和2个问题的表现 处理器,并考虑到可以进行的程序转换 优化两次执行。本练习中的问题参考以下循环 (用C语言编写):

for(i=0;i!=j;i+=2)
b[i]=a[i]–a[i+1];

在编写MIPS代码时,假定变量按如下方式保存在寄存器中,并且除“ Free”以外的所有寄存器都用于保留各种变量,因此它们不能用于其他任何用途。

i : R5; j : R6; a : R1; b : R2; c: R3; Free: R10, R11, R12

4.18.1 [10] <§4.10> 将此C代码转换为MIPS指令。您的翻译应该直接进行,而无需重新安排说明以取得更好的效果。

4.18.2 [10] <§4.10> 如果仅执行两次迭代后循环退出,请在所示的2问题处理器上为4.18.1中的MIPS代码绘制流水线图如图4.69所示。假设处理器具有完美的分支预测,并且可以在同一周期中提取任意两个指令(而不仅仅是连续指令)。

4.18.3 [10] <§4.10> 从4.18.1重新排列代码以获得更好的效果 2个问题的静态调度处理器上的性能。

4.18.4 [10] <§4.10> 重复4.18.2,但这一次使用4.18.3中的MIPS代码。

4.18.1)
加R5,R0,R0
循环:beq R5,R6,退出
    sll R10,R5、2
    添加R3,R10,R1
    lw R11,0(R3)
    lw R12,0(R3)
    子R11,R11,R12
    添加R10,R10,R2
    sw R11,0(R10)
    addi R5,R5、2
    j LOOP
退出:nop

4.18.2)这个问题的表是https://i.imgur.com/e3SeqOy.png,管道阶段是https://imgur.com/Us518aU。我的第一个问题是:在第6周期中,必须打点吗?

糟糕:我考虑了这种类型的转发:
1)ALU-ALU
2)MEM-ALU
3)ALU-MEM
4)ALU-ID

分支结果在ID阶段出来。

我的第二个问题是:通过这些转发,我可以放置具有依赖性的指令,例如:在连续周期中添加 R10 ,R10,R2和SW R11,0( R10 )吗?我的老师评论说,连续周期的数据包之间可能没有依赖性。

4.18.3)
    加R5,R0,R0
循环:beq R5,R6,退出
    sll R10,R5、2
    addi R5,R5、2
    添加R3,R10,R1
    lw R11,0(R3)
    lw R12,0(R3)
    添加R10,R10,R2
    子R11,R11,R12
    sw R11,0(R10)
    j循环
退出:nop

0 个答案:

没有答案