宋光磊MIPS流水线实验报告.docx
《宋光磊MIPS流水线实验报告.docx》由会员分享,可在线阅读,更多相关《宋光磊MIPS流水线实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![宋光磊MIPS流水线实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/10/6af1cf04-3bd2-40df-9b9f-e28a5b50318b/6af1cf04-3bd2-40df-9b9f-e28a5b50318b1.gif)
宋光磊MIPS流水线实验报告
实验三.MIPS流水线实验
MIPS流水线中的运行过程
实验代码
.data
number:
.word321,2,3,4,5,6,7,8,9
.text
main:
daddir2,r0,number
daddir3,r2,24
loop:
lwr1,0(r2)
daddir1,r1,1
swr1,0(r2)
daddir2,r2,4
dsubr4,r3,r2
bnezr4,loop
daddir5,r0,0
daddir6,r0,0
halt
二.可能存在的数据冒险分析
存在冒险的语句组1
daddir2,r0,number
daddir3,r2,24
这两个语句存在数据相关性为r2,第一个句子的r2为目的寄存器,第二个的r2为源寄存器。
因为整数流水线的性质,会出现RAW数据冒险。
单步试验测试如下:
存在冒险的语句组2
lwr1,0(r2)
daddir1,r1,1
其中load指令中的r1为目的寄存器,ADDI中的r1为源寄存器。
两者存在数据相关性。
因为Load指令的数据r1在WB之后才能被下个指令中的ID阶段读取,所以会出现类两个周期的stall。
模拟测试如下:
存在冒险的语句组3
daddir1,r1,1
swr1,0(r2)
其中ADDI指令中的r1和sw中的r1存在数据相关。
同样只用ADDI在经过WB后把r1中的数据存到r1寄存器,sw才能在id阶段获取数据。
因为整数的周期性质,所以后者会在ID阶段等待两个stall
模拟测试结果如下:
存在冒险的语句组4
daddir2,r2,4
dsubr4,r3,r2
在组中ADDI中的r2为目的寄存器,SUB中的r2为源寄存器,因为整数流水线的性质,只有前者在WB时写入r2寄存器,SUB的ID阶段才能获取r2的值。
因此SUB中的id阶段也会有2个stall。
模拟验证如下
存在冒险的语句组5
dsubr4,r3,r2
bnezr4,loop
同理,在该组中r4为两个指令的相关数据,因此在nez中的ID阶段也会出现2个stall的数据冒险。
三.考察前送(forwarding)技术对流水线性能的影响
针对上面的数据冒险情况,有forwarding会对部分数据冒险进行消除。
下面对具体上面的五组数据冒险进行逐一分析。
组1的数据冒险被消除
daddir2,r0,number
daddir3,r2,24
因为使用forwarding技术,使得前者在EX阶段产生的数据直接送到下个指令的EX阶段,因此在该阶段,第二个ADDI指令不用再等到WB阶段在运行。
不会存在stall。
模拟验证如下:
组2的数据冒险未被消除
lwr1,0(r2)
daddir1,r1,1
load指令中的r1和ADDI中的r1存在数据相关,即使存在forwarding技术,因为Load产生可用数据在MEM阶段,而第二个指令ADDI指令的EXE阶段在第一个指令的MEN之前,所以后者必须等一个周期,因此会产生一个stall。
组3的数据冒险消除
daddir1,r1,1
swr1,0(r2)
原因分析和组1的相同,这里不再赘述。
模拟验证如下:
组4数据冒险被消除
daddir2,r2,4
dsubr4,r3,r2
原因分析和组1组3相同。
模拟验证如下:
组5的数据冒险未被消除
dsubr4,r3,r2
bnezr4,loop
模拟验证如下:
四.通过调度减少冒险
修改代码顺序,在Forwarding情况下消除数据冒险,修改后的代码如下。
.data
number:
.word321,2,3,4,5,6,7,8,9
.text
main:
daddir2,r0,number
daddir3,r2,24
loop:
lwr1,0(r2)
daddir2,r2,4
daddir1,r1,1
dsubr4,r3,r2
swr1,-4(r2)
bnezr4,loop
daddir5,r0,0
daddir6,r0,0
halt
单步运行过程如下:
由上图的运行结果可以看出有上面5组情况引起的数据冒险RAW均被消除。
五.总结
为修改代码之前,不使用forwaring技术的运行统计信息如下:
设运行的总周期数为N1
平均每条指令的运行周期CPI1
由图可以看出
CPI1=
N1=100
添加forwarding技术后,运行结果统计如下
设运行的总周期数为N2
平均每条指令的运行周期CPI2
由图可以看出
CPI2=
N2=62
修改代码后,消除必要的数据冒险,运行统计如下
设运行的总周期数为N3
平均每条指令的运行周期CPI3
由图可以看出
CPI3=
N3=50
综上所述:
运行总周期数:
N3CPI:
CPI3结论:
1.通过forwarding和优化代码顺序可以提高代码运行效率;
2.Forwarding不能解决Load后面跟运算和ranch前有运算的数据相关冒险
3.通过修改代码顺序可以解决forwarding解决不了的数据冒险。