3.增加FORWARD部件对性能的影响。
为了对比有无forward部件的性能。需要在Configuration中勾选enable forwarding,以及不勾选enable configuration来看性能数据的对比,不使用forward部件和使用forward部件:
从上面的数据我们可以看出增加forwardi部件后,时钟周期由368减少至301个,RAW由原来占总时钟周期的39.94%减少至26.58%; RAW个数由原来的147减少至80;增加forward部件使得控制相关比例增加了,但是数目并没有增加。总而言之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。
4.观察转移指令在转移成功和转移不成功时候的流水线开销。
由上图可得,转移指令一共16条,其中成功转移15条,占93.75%,不成功转移1条,占5%。
静态指令调度算法是在出现数据相关时,为了消除或者减少流水线空转,编译器确定并分离出程序中存在在相关的指令,然后进行指令调度,并对代码优化。但是静态指令调度只能解决数据相关,条件转移结果与原理来相比没有变化。若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低。若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,每执行一条条件转移指令,一条x段流水线就有x-2个流水线被浪费掉,执行效率降低,性能有一定的损失。
·实验总结
11
加深了对汇编语言的理解与运用,尤其是trap 5,输出格式化到标准输出的理解,在代码中,应注意:相加的结果要保存到dizhi这个变量中,否则即使运算正确也不能把结果输出。
12
实验四 代码优化
·实验目的:
学习简单编译优化方法,观察采用编译优化方法所带来的性能的提高。
·实验原理:
采用静态调度方法重排指令序列,减少相关,优化程序。
·实验步骤:
1.优化实验3程序代码清单及注释说明
.data
V1: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16
V2: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16
a: .asciiz \c: .asciiz \ .align 2 d: .word c dizhi: .space 8 .text .global main main: addi r1,r0,a ;该指令与sw dizhi,r1存在RAW相关,故将addi r8,r0,16和addi r8,r0,16加到中间
addi r10,r0,0 ;该指令与ld f2,V1(r10) 存在RAW相关,故将其提前
addi r8,r0,16 sw dizhi,r1 addi r14,r0,dizhi trap 5 loop: ld f2,V1(r10) ld f4,V2(r10) addi r10,r10,8 subi r8,r8,1 addd f2,f2,f4 ;该指令与前面两条指令均存在RAW相关,将其延后执行
addi r14,r0,d sd dizhi,f2 ;该指令与addd f2,f2,f4存在RAW相关,将其延后执行
trap 5 bnez r8,loop
13
trap 0
执行完毕后,我们点击Statistics查看运行结果数据分析
2.程序相关性分析结果
左图是优化前的,右图是优化后的
由上述两图对比可以看出,数据相关:其RAW相关由优化前的26.58%减少为12.65%,性能改善很多;控制相关:由原来的4.17%变为5.38%,数量没变,没有改善。因此,可以看出,我所进行的代码优化对性能方面改善并不是很强烈,主要影响还是在数据相关方面.
3.增加浮点运算部件对性能的影响。
比较浮点运算部件Count分别为1和2时,
14
接下来查看Statistis进行比较,如下图
由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。 4.增加FORWARD部件对性能的影响。
15