北邮高级计算机系统结构实验二三四五.docx

上传人:叶*** 文档编号:89370714 上传时间:2023-05-05 格式:DOCX 页数:27 大小:824.55KB
返回 下载 相关 举报
北邮高级计算机系统结构实验二三四五.docx_第1页
第1页 / 共27页
北邮高级计算机系统结构实验二三四五.docx_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《北邮高级计算机系统结构实验二三四五.docx》由会员分享,可在线阅读,更多相关《北邮高级计算机系统结构实验二三四五.docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、北邮高级计算机系统结构实验二三四五实验二 指令流水线相关性分析实验目的通过使用WINDLX模拟器,对程序中的三种相关现象进行观察,并对使用专用通路,增加运算部件等技术对性能的影响进行考察,加深对流水线和RISC处理器的特点的理解。实验原理:指令流水线中主要有结构相关、数据相关、控制相关。相关影响流水线性能。实验步骤一使用WinDLX模拟器,对Fact.s做如下分析:(1)观察程序中出现的数据/控制/结构相关。指出程序中出现上述现象的指令组合。(2)考察增加浮点运算部件对性能的影响。(3)考察增加forward部件对性能的影响。(4)观察转移指令在转移成功和转移不成功时候的流水线开销。实验过程一

2、 使用WinDLX模拟器,对Fact.s做如下分析:浮点加、乘、除部件都设置为1,浮点数运算部件的延时都设置为4,如图1:图1 初始设置将fact.s和input.s加载至WinDLX中,如图2示。图2 加载程序1.观察程序中出现的数据/控制/结构相关;指出程序中出现上述现象的指令组合。1) 数据相关点击F7,使程序单步执行,当出现R-Stall时停止,运行过程中出现下图3所示,输入整数6。图3 输入整数6打开Clock Diagram,可以清楚的看到指令执行的流水线如图4所示。图4 指令流水线双击第一次出现R-Stall的指令行,如图5所示。图5 指令详细信息对以上出现的情况分析如下:程序发

3、生了数据相关,R-Stall(R-暂停)表示引起暂停的原因是RAW。lbu r3,00(r2)要在WB周期写回r3中的数据;而下一条指令seqi r5,r3,0a要在intEX周期中读取r3中的数据。上述过程发生了WR冲突,即写读相关。为了避免此类冲突,seq r5,r4,0a的intEX指令延迟了一个周期进行。由此,相关指令为:2) 控制相关由图6可以看出,在第4时钟周期:第一条指令处于MEM段,第二条命令处于intEX段,第三条指令出于aborted状态,第四条命令处于IF段。图 6 指令流水线以上情况原因分析:在窗口中,模拟处于第四时钟周期,第3条命令指示为:“aborted”。原因是:

4、第二条命令jal InputUnsigned是无条件分支指令,在第4个时钟周期,jal指令执行intEX周期之后才知道转移的位置,下一条指令应该执行sw SaveR2(r0),r2指令。但之前jal InputUnsigned的下一条命令movi2fp f10.r1已经取出,所以需要将该指令流水清空,即movi2fp的执行应被取消,在流水线中留下气泡。3) 结构相关首先,我们先来看一下执行过控制相关的时空图和Pipeline,如下图7所示。图7 控制相关图8 控制相关的Pipeline当我们点击Pipeline中IF所对应的框框可以看到详细的该指令执行情况,如下图9所示。图9 指令详情图9表明

5、了addi r2,r2,01的详细信息。该指令及它前一条指令add r1,r1,r3发生了结构相关。并且由于此处的冲突,需要暂停2个周期。在ID段暂停后,则开始进图intEX段。所以这条指令(addi r2,r2,01)你不能进入ID流水段,译码部分占用,发生了结构相关。该部分的指令为:1. 考察增加浮点运算部件对性能的影响。该实验取N=6首先通过Configuration,点击Floating Point Stage Configuration来设置浮点运算部件的配置。实验要求所有浮点运算部件的延时都请设定为4个周期,所以我们将Delay这一栏改成4,而Count可以任意,为了对比,我们第一

6、次浮点运算部件取全部为1,第二次浮点运算部件取全部为2。如下图所示:运行50个cycles之后,可以看到他们数据的对比:由此可见,浮点运算部件的增减对效率无影响。比较各个数据,发现没有变化。无论怎么增加浮点运算部件,统计结果都一样。原因在于此程序中浮点计算指令没有重叠,所以并行度没有增加,性能没有提高。3.考察增加forward部件对性能的影响。 为了对比有无forward部件的性能。需要在Configuration中勾选enable forwarding,以及不勾选enable configuration来看性能数据的对比,不使用forward部件和使用forward部件:从上面的数据我们可

7、以看出增加forward部件后RAW由原来占总时钟周期的26%减少至18%,RAW个数由原来的13减少至9。增加forward部件使得控制相关比例增加了。即,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。4.观察转移指令在转移成功和转移不成功时候的流水线开销。我们假设,浮点部件设置Count=1,Delay=4;N=6。执行50个cycles完毕后,查看条件转移分支,如下图所示:由上图可知,转移指令一共2条,成功转移1条(占50%),不成功为1条。所以,静态指令调度算法只能解决数据相关,条件转移结果及原来相比没有变化。即,若转移不成功,对流水线的执行无影

8、响,流水线的吞吐率和效率没有降低;若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,执行效率会下降。实验总结通过本次试验,不仅更加熟悉了WinDLX模拟器的使用以及对其基础功能的认识,而且通过单步执行程序,观察三种相关的出现,以及思考出现的原因,是我更加深入了解了流水线。实验三 DLX处理器程序设计实验目的:学习使用DLX汇编语言编程,进一步分析相关现象实验原理:掌握向量运算算法和编程方法。实验内容和要求: 自编一段汇编代码,完成两双精度浮点一维向量的加法(或乘除法)运算,并输出结果。向量长度=16。观察程序中出现的数据/控制/结构相关实验步骤:一熟悉DLX汇编语言。 (1)汇编器

9、处理汇编文件时,数据位于内存中data指针所指向的空间,指令位于text指针所指向的空间。 (2)Trap 0是通知WINDLX模拟器程序结束,Trap 5是输出格式化到标准输出二编写两双精度浮点一维向量的加法运算程序。 代码清单如下:.dataV1: .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.16V2: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.1

10、2, 13.13, 14.14, 15.15, 16.16a: .asciiz result = c: .asciiz %f .align 2d: .word cdizhi: .space 8 .text .global mainmain:addi r1,r0,asw dizhi,r1 ;存储字,保存a的首地址addi r14,r0,dizhitrap 5 ;输出字符串result = addi r10,r0,0 ;r10 = 0addi r8,r0,20 ;r8 = 20,即向量的长度loop:ld f2,V1(r10) ld f4,V2(r10)addd f2,f2,f4 ;将V1,V2的

11、相应项依次相加,保存在f2sd dizhi,f2 ;存储双精度浮点数f2addi r14,r0,dtrap 5 ;输出结果addi r10,r10,8 ;取V1,V2下一项subi r8,r8,1 ;循环次数减一bnez r8,loop ;假如r8!=0,则返回到looptrap 0 ;结束运行完毕之后出现:运行结果如下:1.观察程序中出现的数据/控制/结构相关 本次实验执行过程共出现RAW数据相关80次,控制相关15次,trap54次,共有stall 149次。具体如下:1) 数据相关2) T-stall3) 控制相关2.考察增加浮点运算部件对性能的影响。比较浮点运算部件分别为1和2时, 接

12、下来查看Statistis进行比较,如下图由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。3.增加FORWARD部件对性能的影响。为了对比有无forward部件的性能。需要在Configuration中勾选enable forwarding,以及不勾选enable configuration来看性能数据的对比,不使用forward部件和使用forward部件: 从上面的数据我们可以看出增加forwardi部件后,时钟周期由368减少至301个,RAW由原来占总时钟周期的39.94%减少至26.58%; RAW个数由原来的147减少至80;增加forward部件使得控制相关比例增加了

13、,但是数目并没有增加。总而言之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。4.观察转移指令在转移成功和转移不成功时候的流水线开销。 由上图可得,转移指令一共16条,其中成功转移15条,占93.75%,不成功转移1条,占5%。 静态指令调度算法是在出现数据相关时,为了消除或者减少流水线空转,编译器确定并分离出程序中存在在相关的指令,然后进行指令调度,并对代码优化。但是静态指令调度只能解决数据相关,条件转移结果及原理来相比没有变化。若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低。若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指

14、令,每执行一条条件转移指令,一条x段流水线就有x-2个流水线被浪费掉,执行效率降低,性能有一定的损失。实验总结 加深了对汇编语言的理解及运用,尤其是trap 5,输出格式化到标准输出的理解,在代码中,应注意:相加的结果要保存到dizhi这个变量中,否则即使运算正确也不能把结果输出。 实验四 代码优化实验目的:学习简单编译优化方法,观察采用编译优化方法所带来的性能的提高。实验原理:采用静态调度方法重排指令序列,减少相关,优化程序。实验步骤:1优化实验3程序代码清单及注释说明.dataV1: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9,

15、10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16V2: .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.16a: .asciiz result = c: .asciiz %f .align 2d: .word cdizhi: .space 8 .text .global mainmain:addi r1,r0,a;该指令及sw dizhi,r1存在RAW相关,故将addi r8,r0,16和addi r8,

16、r0,16加到中间addi r10,r0,0;该指令及ld f2,V1(r10) 存在RAW相关,故将其提前addi r8,r0,16sw dizhi,r1addi r14,r0,dizhitrap 5loop:ld f2,V1(r10) ld f4,V2(r10)addi r10,r10,8subi r8,r8,1addd f2,f2,f4;该指令及前面两条指令均存在RAW相关,将其延后执行addi r14,r0,dsd dizhi,f2;该指令及addd f2,f2,f4存在RAW相关,将其延后执行trap 5bnez r8,looptrap 0执行完毕后,我们点击Statistics查看

17、运行结果数据分析2.程序相关性分析结果左图是优化前的,右图是优化后的由上述两图对比可以看出,数据相关:其RAW相关由优化前的26.58%减少为12.65%,性能改善很多;控制相关:由原来的4.17%变为5.38%,数量没变,没有改善。因此,可以看出,我所进行的代码优化对性能方面改善并不是很强烈,主要影响还是在数据相关方面.3.增加浮点运算部件对性能的影响。比较浮点运算部件Count分别为1和2时, 接下来查看Statistis进行比较,如下图 由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。4.增加FORWARD部件对性能的影响。 从上面的数据我们可以看出增加forwardi部件后

18、:时钟周期由285减少至253个,RAW由原来占总时钟周期的22.46%减少至12.65%;RAW个数由原来的64减少至32;增加forward部件使得控制相关比例增加了,但是数目并没有增加。总而言之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。5.观察转移指令在转移成功和转移不成功时候的流水线开销。由上图可得,转移指令一共16条,其中成功转移15条,占93.75%,不成功转移1条,占6.25%。优化对于转移指令并无影响。静态指令调度算法是在出现数据相关时,为了消除或者减少流水线空转,编译器确定并分离出程序中存在在相关的指令,然后进行指令调度,并对代码

19、优化。但是静态指令调度只能解决数据相关,条件转移结果及原理来相比没有变化。若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低。若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,每执行一条条件转移指令,一条x段流水线就有x-2个流水线被浪费掉,执行效率降低,性能有一定的损失。解决的困难、解决方法和实习体会 代码优化的关键在于相关性的分析,它关系到能否进行优化以及怎么优化。采用静态调度方法重排指令序列要保证调整顺序之后不影响指令执行。若两条相邻的指令存在RAW相关时,在重排指令的时候,该两条指令之间插入至少两条其它指令才能保证消除stall。相邻的指令访问相同的寄存器并不

20、代表就会存在冲突,比如指令:addi r1,r0,aaddi r10,r0,0addi r8,r0,16以上三条指令均需要访问寄存器r0,但是由于都是读r0,所以不存在冲突。 代码优化的目的就是减少相关性的发生,提高流水线的效率。经过代码优化这一实验后,我更加深入理解了相关性的概念。此外,采用静态调度方法重排指令序列及forwarding技术相结合,可以提高流水线的效率。实验五 循环展开(选作)实验目的:进一步学习DLX汇编语言编程方法,学习循环展开编译优化方法,观察采用循环展开编译优化方法所带来的性能的提高。实验原理:对循环程序采用循环展开(loop unrolling)方法进行优化,减少相

21、关。实验步骤:1.编写矩阵相乘程序(1)主要实现的C代码如下double s1 = 1.1;for(int i=0;i10;i+)for(int j=0;j10;j+)MAij=s1;MBij=s1;for(int i=0;i10;i+)for(int j=0;j10;j+)for(double data=0,int k=0;k10;k+)data+=MAik*MBkj;MCij=data;(2)用windlx编写的汇编指令如下: .dataMA: .space 400MB: .space 400MC: .space 400s1: .float 1.1.text.global mainmain

22、:addi r1,r0,MA ;将MA的地址 赋给r1addi r3,r0,MB;将MB的地址 赋给r3addi r11,r1,#400 ;MA的 末地址lf f2,s1;对矩阵MA MB进行初始化init:sf 0(r1),f2 ;将f2的值赋给MAijsf 0(r3),f2addi r1,r1,#4addi r3,r3,#4slt r2,r1,r11 ;比较r1 和MA的末地址是否相等bnez r2,init ;不等 则继续循环;主循环 开始addi r21,r0,#40 ;常量addi r22,r0,#10 ;常量addi r23,r0,#4addi r29,r0,#0addi r7,r

23、29,#0 ;i = 0loop1:addi r8,r29,#0 ;j = 0loop2:addi r9,r29,#0 ;k = 0;movi2fp f0,r29 ;data = 0 给变量赋0;下面开始第三层的主循环loop3:multu r11,r7,r21 ;r11 = i * 40multu r1,r9,r23 ;r1 = k * 4addu r11,r11,r1 ;计算出 MAik 的地址 ld f2,MA(r11)multu r13,r9,r21 ;r13 = k * 40multu r1,r8,r23 ;r1 = j * 4addu r13,r13,r1 ;计算出 MBkj 的地

24、址ld f4,MB(r13)multf f6,f2,f4addf f0,f0,f6 ;data += MAik * MBkj;addi r9,r9,#1 ;k+;slt r2,r9,r22 ;r9 即 k是否等于10bnez r2,loop3 ;不等 继续循环;那么 这里要完成这个操作MCij = data;multu r13,r7,r21 ;r13 = i *40multu r1,r8,r23 ;r1 = j*4addu r13,r13,r1 ;计算 MCij 的地址sf MC(r13),f0addi r8,r8,#1slt r2,r8,r22 ;r8 即 j是否等于10bnez r2,lo

25、op2 ;不等 继续循环addi r7,r7,#1slt r2,r7,r22 ;r7 即 i是否等于10bnez r2,loop1 ;不等 继续循环 trap 0 ; end of program运行结果如下:由于没有写输出语句,所以可以从Register中看到我们想要的结果(相乘的结果存在F0中)2.观察程序中出现的数据/控制/结构相关本次实验执行过程共出现RAW数据相关2284次,控制相关78次,trap66次,共有stall 2860次。具体如下:1)数据相关和结构相关multf f6, f2 ,f4 及add f0 , f0 , f6数据相关前一指令要写入f6而后一条要读f6造成WR相

26、关add 指令要等四个周期同时 add r9, r9 ,0x1及前一条指令的冲突,这一条指令等待ID单元空出。2)控制相关bnez r2,loop3发生跳转在intEX才执行立马阻止multu r13 , r7 ,r21指令的译码,要清空后面点流水线,这条乘法指令出现aborted异常。3.考察增加浮点运算部件对性能的影响。比较浮点运算部件分别为1和2时。 接下来查看Statistis进行比较,如下图 可以看出增加运算单元会增加CPI从691条指令增加到710条,主要是结构相关从3.6%减少到0,例如:可以使相邻的乘法指令并行执行。4.增加FORWARD部件对性能的影响。 从上面的数据我们可以

27、看出增加forwardi部件后RAW由原来占总时钟周期的30%减少至16.7%,RAW个数由原来的300减少至167。增加forward部件使得控制相关比例增加了,使得部件使用更紧凑了,S-Tall从0增加到了36。但总体相关还是减少的,即,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。5.观察转移指令在转移成功和转移不成功时候的流水线开销。我们假设,浮点部件设置Count=1,Delay=4。执行完毕后,查看条件转移分支,如下图所示:由上图可知,转移指令一共106条,成功转移105条(占99.06%),不成功为1条。所以,静态指令调度算法只能解决数据相

28、关,条件转移结果及原来相比没有变化。即,若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低;若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,执行效率会下降。5.使用循环展开手工优化程序 .dataMA: .space 400MB: .space 400MC: .space 400s1: .float 1.1.text.global mainmain:addi r1,r0,MA ;将MA的地址 赋给r1addi r3,r0,MB;将MB的地址 赋给r3addi r11, r1, #400 ;MA的 末地址lf f2,s1;对矩阵MA MB进行初始化init:sf 0(

29、r1),f2 ;将f2的值赋给MAisf 0(r3),f2addi r1,r1,#4addi r3,r3,#4slt r2,r1,r11 ;比较r1 和MA的末地址是否相等bnez r2,init ;不等 则继续循环;主循环 开始addi r21,r0,#40 ;常量addi r22,r0,#10 ;常量addi r23,r0,#4addi r29,r0,#0 addi r7,r29,0 ;i = 0loop1:addi r8,r29,0 ;j = 0multu r11,r7,r21 ;r11 = i * 40loop2:addi r9,r29,0 ;k = 0;movi2fp f0,r29

30、;data = 0 给变量赋0multu r1,r8,r23 ;r1 = j * 4;下面开始第三层的主循环loop3:multu r1,r9,r23 ;r1 = k * 4addu r11,r11,r1 ;计算出 MAik 的地址 ld f2,MA(r11)multu r13,r9,r21 ;r13 = k * 40addu r13,r13,r1 ;计算出 MBkj 的地址ld f4,MB(r13)multf f6,f2,f4addf f0,f0,f6 ;data += MAik * MBkj;addi r9,r9,#1 ;k+multu r1,r9,r23 ;r1 = k * 4addu

31、r11,r11,r1 ;计算出 MAik 的地址 ld f2,MA(r11)multu r13,r9,r21 ;r13 = k * 40addu r13,r13,r1 ;计算出 MBkj 的地址ld f4,MB(r13)multf f6,f2,f4addf f0,f0,f6 ;data += MAik * MBkj;addi r9,r9,#1 ;k+slt r2,r9,r22 ;r9 即 k是否等于10bnez r2,loop3 ;不等 继续循环;那么 这里要完成这个操作MCij = data;multu r13,r7,r21 ;r13 = i *40multu r1,r8,r23 ;r1 =

32、 j*4addu r13,r13,r1 ;计算 MCij 的地址sf MC(r13),f0addi r8,r8,#1slt r2,r8,r22 ;r8 即 j是否等于10bnez r2,loop2 ;不等 继续循环addi r7,r7,#1slt r2,r7,r22 ;r7 即 i是否等于10bnez r2,loop1 ;不等 继续循环 trap 0 ; end of program6.未优化代码和优化代码性能分析比较结果执行完毕后,我们点击Statistics查看运行结果数据分析(左图是改进前的运行情况,右图是改进后的运行情况)从上面的数据我们可以看出代码经过循环优化后:时钟周期由33463

33、减少至24063个,RAW由原来的1511减少至11011;浮点运算指令由6200条减少到了4400条,其中浮点加法没有改变,而浮点乘法则由5200减少至3400条。 总而言之,总的时钟周期,数据相关,浮点运算指令均大大减少,流水线的性能得到明显改善。7.对优化程序,考察增加浮点运算部件对性能的影响。 将浮点加法器由1个增加为2个后(右图为2个),可以由上图看出,程序执行的性能得到了提升,结构相关由700减到0。8.对优化程序,将浮点部件的延迟改为8个时钟周期,考察增加浮点运算部件对性能的影响。将浮点部件的延迟改为8个时钟周期,数据相关的数量大大增加,指令执行周期也增加了。实验总结循环优化的难点是将循环内部的乘法改为增量时,在哪里改为增量,在哪里又重新初始化为0或下一次增量的初始值。在判断循环是否继续处添加增量,在循环开始处重新初始化为0或下一次增量的初始值。27 / 2727 / 27

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁