从上面的数据我们可以看出增加forwardi部件后:时钟周期由285减少至253个,RAW由原来占总时钟周期的22.46%减少至12.65%;RAW个数由原来的64减少至32;增加forward部件使得控制相关比例增加了,但是数目并没有增加。总而言之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。
5.观察转移指令在转移成功和转移不成功时候的流水线开销。
由上图可得,转移指令一共16条,其中成功转移15条,占93.75%,不成功转移1条,占6.25%。优化对于转移指令并无影响。
静态指令调度算法是在出现数据相关时,为了消除或者减少流水线空转,编译器确定并分离出程序中存在在相关的指令,然后进行指令调度,并对代码优化。但是静态指令调度只能解决数据相关,条件转移结果与原理来相比没有变化。若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低。若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,每执行一条条件转移指令,一条x段流水线就有x-2个流水线被浪费掉,执行效率降低,性能有一定的损失。
·解决的困难、解决方法和实习体会
代码优化的关键在于相关性的分析,它关系到能否进行优化以及怎么优化。
采用静态调度方法重排指令序列要保证调整顺序之后不影响指令执行。若两条相邻的指令存在RAW相关时,在重排指令的时候,该两条指令之间插入至少
16
两条其它指令才能保证消除stall。
相邻的指令访问相同的寄存器并不代表就会存在冲突,比如指令: addi r1,r0,a addi r10,r0,0 addi r8,r0,16
以上三条指令均需要访问寄存器r0,但是由于都是读r0,所以不存在冲突。 代码优化的目的就是减少相关性的发生,提高流水线的效率。经过代码优化这一实验后,我更加深入理解了相关性的概念。此外,采用静态调度方法重排指令序列与forwarding技术相结合,可以提高流水线的效率。
17
实验五 循环展开(选作)
实验目的:
进一步学习DLX汇编语言编程方法,学习循环展开编译优化方法,观察采用循环展开编译优化方法所带来的性能的提高。
实验原理:
对循环程序采用循环展开(loop unrolling)方法进行优化,减少相关。
实验步骤:
1.编写矩阵相乘程序
(1)主要实现的C代码如下 double s1 = 1.1; for(int i=0;i<10;i++) for(int j=0;j<10;j++) { }
for(int i=0;i<10;i++) for(int j=0;j<10;j++) { }
(2)用windlx编写的汇编指令如下: .data
MA: .space 400 MB: .space 400 MC: .space 400 s1: .float 1.1
.text .global main
for(double data=0,int k=0;k<10;k++)
data+=MA[i][k]*MB[k][j]; MC[i][j]=data;
MA[i][j]=s1; MB[i][j]=s1;
main:
18
addi r1,r0,MA addi r3,r0,MB
addi r11,r1,#400 lf f2,s1
;对矩阵MA MB进行初始化 init:
sf 0(r1),f2
sf 0(r3),f2 addi r1,r1,#4 addi r3,r3,#4
slt r2,r1,r11 bnez r2,init
;主循环 开始
addi r21,r0,#40 addi r22,r0,#10 addi r23,r0,#4 addi r29,r0,#0
addi r7,r29,#0 loop1:
addi r8,r29,#0 loop2: addi r9,r29,#0 movi2fp f0,r29 ;下面开始第三层的主循环 loop3: multu r11,r7,r21 multu r1,r9,r23 addu r11,r11,r1 ld f2,MA(r11)
multu r13,r9,r21 multu r1,r8,r23 addu r13,r13,r1
ld f4,MB(r13)
19
;将MA的地址 赋给r1 ;将MB的地址 赋给r3 ;MA的 末地址
;将f2的值赋给MA[i][j]
;比较r1 和MA的末地址是否相等
;不等 则继续循环
;常量 ;常量
;i = 0 ;j = 0 ;k = 0;
;data = 0 给变量赋0
;r11 = i * 40 ;r1 = k * 4 ;计算出 MA[i][k] 的地址
;r13 = k * 40 ;r1 = j * 4
计算出 MB[k][j] 的地址
;
multf f6,f2,f4 addf f0,f0,f6 addi r9,r9,#1 slt r2,r9,r22 bnez r2,loop3
;data += MA[i][k] * MB[k][j]; ;k++;
;r9 即 k是否等于10 ;不等 继续循环 ;r13 = i *40 ;r1 = j*4
;计算 MC[i][j] 的地址
;那么 这里要完成这个操作MC[i][j] = data; multu r13,r7,r21 multu r1,r8,r23 addu r13,r13,r1 sf MC(r13),f0
;r8 即 j是否等于10 ;不等 继续循环
addi r8,r8,#1 slt r2,r8,r22 bnez r2,loop2
addi r7,r7,#1 slt r2,r7,r22 bnez r2,loop1 trap 0
;r7 即 i是否等于10 ;不等 继续循环 ; end of program
运行结果如下:
由于没有写输出语句,所以可以从Register中看到我们想要的结果(相乘的结果存在F0中)
2.观察程序中出现的数据/控制/结构相关
本次实验执行过程共出现RAW数据相关2284次,控制相关78次,trap66次,共有stall 2860次。具体如下:
1)数据相关和结构相关
20