multf f6, f2 ,f4 与add f0 , f0 , f6数据相关前一指令要写入f6而后一条要读f6造成WR相关add 指令要等四个周期同时 add r9, r9 ,0x1与前一条指令的冲突,这一条指令等待ID单元空出。 2)控制相关
bnez r2,loop3发生跳转在intEX才执行立马阻止multu r13 , r7 ,r21指令的译码,要清空后面点流水线,这条乘法指令出现aborted异常。 3.考察增加浮点运算部件对性能的影响。
比较浮点运算部件分别为1和2时。
21
接下来查看Statistis进行比较,如下图
可以看出增加运算单元会增加CPI从691条指令增加到710条,主要是结构相关从3.6%减少到0,例如:
22
可以使相邻的乘法指令并行执行。
4.增加FORWARD部件对性能的影响。
从上面的数据我们可以看出增加forwardi部件后RAW由原来占总时钟周
期的30%减少至16.7%,RAW个数由原来的300减少至167。增加forward部件使得控制相关比例增加了,使得部件使用更紧凑了,S-Tall从0增加到了36。但总体相关还是减少的,即,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。
5.观察转移指令在转移成功和转移不成功时候的流水线开销。
我们假设,浮点部件设置Count=1,Delay=4。执行完毕后,查看条件转移分支,如下图所示:
由上图可知,转移指令一共106条,成功转移105条(占99.06%),不成功为1条。所以,静态指令调度算法只能解决数据相关,条件转移结果与原来相比没有变化。即,若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低;若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,
23
执行效率会下降。
5.使用循环展开手工优化程序 .data
MA: .space 400 MB: .space 400 MC: .space 400 s1: .float 1.1 .text
.global main main:
addi r1,r0,MA ;将MA的地址 赋给r1 addi r3,r0,MB ;将MB的地址 赋给r3 addi r11, r1, #400 ;MA的 末地址 lf f2,s1
;对矩阵MA MB进行初始化 init:
sf 0(r1),f2 ;将f2的值赋给MA[i] sf 0(r3),f2 addi r1,r1,#4 addi r3,r3,#4
slt r2,r1,r11 ;比较r1 和MA的末地址是否相等 bnez r2,init ;不等 则继续循环 ;主循环 开始
addi r21,r0,#40 ;常量 addi r22,r0,#10 ;常量 addi r23,r0,#4
addi r29,r0,#0 addi r7,r29,0 ;i = 0 loop1:
addi r8,r29,0 ;j = 0
multu r11,r7,r21 ;r11 = i * 40 loop2:
addi r9,r29,0 ;k = 0;
movi2fp f0,r29 ;data = 0 给变量赋0 multu r1,r8,r23 ;r1 = j * 4 ;下面开始第三层的主循环 loop3:
multu r1,r9,r23 ;r1 = k * 4
addu r11,r11,r1 ;计算出 MA[i][k] 的地址 ld f2,MA(r11)
multu r13,r9,r21 ;r13 = k * 40 addu r13,r13,r1 ;计算出 MB[k][j] 的地址 ld f4,MB(r13) multf f6,f2,f4
24
addf f0,f0,f6 ;data += MA[i][k] * MB[k][j]; addi r9,r9,#1 ;k++
multu r1,r9,r23 ;r1 = k * 4
addu r11,r11,r1 ;计算出 MA[i][k] 的地址 ld f2,MA(r11)
multu r13,r9,r21 ;r13 = k * 40 addu r13,r13,r1 ;计算出 MB[k][j] 的地址 ld f4,MB(r13) multf f6,f2,f4
addf f0,f0,f6 ;data += MA[i][k] * MB[k][j]; addi r9,r9,#1 ;k++
slt r2,r9,r22 ;r9 即 k是否等于10 bnez r2,loop3 ;不等 继续循环 ;那么 这里要完成这个操作MC[i][j] = data; multu r13,r7,r21 ;r13 = i *40 multu r1,r8,r23 ;r1 = j*4
addu r13,r13,r1 ;计算 MC[i][j] 的地址 sf MC(r13),f0 addi r8,r8,#1
slt r2,r8,r22 ;r8 即 j是否等于10 bnez r2,loop2 ;不等 继续循环 addi r7,r7,#1
slt r2,r7,r22 ;r7 即 i是否等于10 bnez r2,loop1 ;不等 继续循环 trap 0 ; end of program 6.未优化代码和优化代码性能分析比较结果
执行完毕后,我们点击Statistics查看运行结果数据分析 (左图是改进前的运行情况,右图是改进后的运行情况)
25