计算机组织与设计,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