..实验二指令流水线相关性分析·实验目的通过使用WINDLX模拟器,对程序中的三种相关现象进行观察,并对使用专用通路,增加运算部件等技术对性能的影响进行考察,加深对流水线和RISC处理器的特点的理解。·实验原理:指令流水线中主要有结构相关、数据相关、控制相关。相关影响流水线性能。·实验步骤一.使用WinDLX模拟器,对Fact.s做如下分析:(1)观察程序中出现的数据/控制/结构相关。指出程序中出现上述现象的指令组合。(2)考察增加浮点运算部件对性能的影响。(3)考察增加forward部件对性能的影响。(4)观察转移指令在转移成功和转移不成功时候的流水线开销。·实验过程一.使用WinDLX模拟器,对Fact.s做如下分析:浮点加、乘、除部件都设置为1,浮点数运算部件的延时都设置为4,如图1:图1初始设置将fact.s和input.s加载至WinDLX中,如图2示。2图2加载程序1.观察程序中出现的数据/控制/结构相关;指出程序中出现上述现象的指令组合。1)数据相关点击F7,使程序单步执行,当出现R-Stall时停止,运行过程中出现下图3所示,输入整数6。图3输入整数6打开ClockDiagram,可以清楚的看到指令执行的流水线如图4所示。图4指令流水线双击第一次出现R-Stall的指令行,如图5所示。3图5指令详细信息对以上出现的情况分析如下:程序发生了数据相关,R-Stall(R-暂停)表示引起暂停的原因是RAW。lbur3,0×0(r2)要在WB周期写回r3中的数据;而下一条指令seqir5,r3,0×a要在intEX周期中读取r3中的数据。上述过程发生了WR冲突,即写读相关。为了避免此类冲突,seqr5,r4,0×a的intEX指令延迟了一个周期进行。由此,相关指令为:2)控制相关由图6可以看出,在第4时钟周期:第一条指令处于MEM段,第二条命令处于intEX段,第三条指令出于aborted状态,第四条命令处于IF段。图6指令流水线4以上情况原因分析:在窗口中,模拟处于第四时钟周期,第3条命令指示为:“aborted”。原因是:第二条命令jalInputUnsigned是无条件分支指令,在第4个时钟周期,jal指令执行intEX周期之后才知道转移的位置,下一条指令应该执行swSaveR2(r0),r2指令。但之前jalInputUnsigned的下一条命令movi2fpf10.r1已经取出,所以需要将该指令流水清空,即movi2fp的执行应被取消,在流水线中留下气泡。3)结构相关首先,我们先来看一下执行过控制相关的时空图和Pipeline,如下图7所示。图7控制相关图8控制相关的Pipeline当我们点击Pipeline中IF所对应的框框可以看到详细的该指令执行情况,如下图9所示。5图9指令详情图9表明了addir2,r2,0×1的详细信息。该指令与它前一条指令addr1,r1,r3发生了结构相关。并且由于此处的冲突,需要暂停2个周期。在ID段暂停后,则开始进图intEX段。所以这条指令(addir2,r2,0×1)你不能进入ID流水段,译码部分占用,发生了结构相关。该部分的指令为:1.考察增加浮点运算部件对性能的影响。该实验取N=6首先通过Configuration,点击FloatingPointStageConfiguration来设置浮点运算部件的配置。实验要求所有浮点运算部件的延时都请设定为4个周期,所以我们将Delay这一栏改成4,而Count可以任意,为了对比,我们第一次浮点运算部件取全部为1,第二次浮点运算部件取全部为2。如下图所示:运行50个cycles之后,可以看到他们数据的对比:6由此可见,浮点运算部件的增减对效率无影响。比较各个数据,发现没有变化。无论怎么增加浮点运算部件,统计结果都一样。原因在于此程序中浮点计算指令没有重叠,所以并行度没有增加,性能没有提高。3.考察增加forward部件对性能的影响。为了对比有无forward部件的性能。需要在Configuration中勾选enableforwarding,以及不勾选enableconfiguration来看性能数据的对比,不使用forward部件和使用forward部件:从上面的数据我们可以看出增加forward部件后RAW由原来占总时钟周期的26%减少至18%,RAW个数由原来的13减少至9。增加forward部件使得控制相关比例增加了。即,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。4.观察转移指令在转移成功和转移不成功时候的流水线开销。我们假设,浮点部件设置Count=1,Delay=4;N=6。执行50个cycles完毕后,查看条件转移分支,如下图所示:由上图可知,转移指令一共2条,成功转移1条(占50%),不成功为1条。所以,静态指令调度算法只能解决数据相关,条件转移结果与原来相比没有变化。即,若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低;若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,执行效率会下降。·实验总结通过本次试验,不仅更加熟悉了WinDLX模拟器的使用以及对其基础功能的7认识,而且通过单步执行程序,观察三种相关的出现,以及思考出现的原因,是我更加深入了解了流水线。8实验三DLX处理器程序设计·实验目的:学习使用DLX汇编语言编程,进一步分析相关现象·实验原理:掌握向量运算算法和编程方法。·实验内容和要求:自编一段汇编代码,完成两双精度浮点一维向量的加法(或乘除法)运算,并输出结果。向量长度=16。观察程序中出现的数据/控制/结构相关·实验步骤:一.熟悉DLX汇编语言。(1)汇编器处理汇编文件时,数据位于内存中data指针所指向的空间,指令位于text指针所指向的空间。(2)Trap0是通知WINDLX模拟器程序结束,Trap5是输出格式化到标准输出二.编写两双精度浮点一维向量的加法运算程序。代码清单如下:.dataV1:.double1.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.16V2:.double1.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.16a:.asciizresult=c:.asciiz%f.align2d:.wordcdizhi:.space8.text.globalmainmain:addir1,r0,aswdizhi,r1;存储字,保存a的首地址addir14,r0,dizhitrap5;输出字符串result=addir10,r0,0;r10=0addir8,r0,20;r8=20,即向量的长度loop:ldf2,V1(r10)ldf4,V2(r10)adddf2,f2,f4;将V1,V2的相应项依次相加,保存在f2sddizhi,f2;存储双精度浮点数f29addir14,r0,dtrap5;输出结果addir10,r10,8;取V1,V2下一项subir8,r8,1;循环次数减一bnezr8,loop;假如r8!=0,则返回到looptrap0;结束运行完毕之后出现:运行结果如下:1.观察程序中出现的数据/控制/结构相关本次实验执行过程共出现RAW数据相关80次,控制相关15次,trap54次,共有stall149次。具体如下:1)数据相关2)T-stall103)控制相关2.考察增加浮点运算部件对性能的影响。比较浮点运算部件分别为1和2时,接下来查看Statistis进行比较,如下图由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。113.增加FORWARD部件对性能的影响。为了对比有无forward部件的性能。需要在Configuration中勾选enableforwarding,以及不勾选enableconfiguration来看性能数据的对比,不使用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个流水线被浪费掉,执行效率降低,性能有一定的损失。·实验总结12加深了对汇编语言的理解与运用,尤其是trap5,输出格式化到标准输出的理解,在代码中,应注意:相加的结果要保存到dizhi这个变量中,否则即使运算正确也不能把结果输出。13实验四代码优化·实验目的:学习简单编译优化方法,观察采用编译优化方法所带来的性能的提高。·实验原理:采用静态调度方法重排指令序列,减少相关,优化程序。·实验步骤:1.优化实验3程序代码清单及注释说明.dataV1:.double1.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.16V2:.double1.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.16a:.asciizresult=c:.asciiz%f.align2d:.wordcdizhi:.space8.text.globalmainmain:addir1,r0,a;该指令与swdizhi,r1存在RAW相关,故将addir8,r0,16和addir8,r0,16加到中间addir10,r0,0;该指令与ldf2,V1(r10)存在RAW相关,故将其提前addir8,r0,16swdizhi,r1addir14,r0,dizhitrap5loop:ldf2,V1(r10)ldf4,V2(r10)addir10,r10,8subir8,r8,1adddf2,f2,f4;该指令与前面两条指令均存在RAW相关,将其延后执行addir14,r0,dsddizhi,f2;该指令与adddf2,f2,f4存在RAW相关,将其延后执行trap5bnezr8,loop14trap0执行完毕后,我们点击Statistics查看运行结果数据分析2.程序相关性分析结果左图是优化前的,右图是优化后的由上述两图对比可以看出,数据相关:其RAW相关由优化前的26.58%减少为12.65%,性能改善很多;控制相关:由原来的4.17%变为5.38%,数量没变,没有改善。因此,可以看出,我所进行的代码优化对性能方面改善并不是很强烈,主要影响还是在数据相关方面.3.增加浮点运算部件对性能的影响。比较浮点运算部件Count分别为1和2时,15接下来查看Statistis进行比较,如下图由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。4.增加FORWARD部件对性能的影响。16从上面的数据我们可以看出增加forwardi部件后:时钟周期由285减少至253个,RAW由原来占总时钟周期的22.46%减少至12.65%;RAW个数由原来的64减少至32;增加forward部件使得控制相关比例增