LAJI实验一二三报告.docx
《LAJI实验一二三报告.docx》由会员分享,可在线阅读,更多相关《LAJI实验一二三报告.docx(30页珍藏版)》请在冰豆网上搜索。
![LAJI实验一二三报告.docx](https://file1.bdocx.com/fileroot1/2023-2/28/2609e910-ec2d-4ee5-93ac-8c1cfeac2ba9/2609e910-ec2d-4ee5-93ac-8c1cfeac2ba91.gif)
LAJI实验一二三报告
信息学部
实验报告
课程名称计算机系统结构
本人学号16105120姓名张启琳
同组同学学号16110115姓名应屹
提交日期年月日
实验一流水线中的相关
实验目的
1.熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;
2.加深对计算机流水线基本概念的理解;
3.加深对数据相关、资源相关的理解,了解这两类相关对CPU性能的影响;
4.了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停。
实验内容
1.用WinDLX模拟器执行下列三个程序(任选一个):
求阶乘程序fact.s
求最大公倍数程序gcm.s
求素数程序prim.s
2.分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
熟练掌握WinDLX的操作和使用。
3.用WinDLX运行程序structure_d.s,通过模拟:
找出存在资源相关的指令对以及导致资源相关的部件;
记录由资源相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期数的百分比;
论述资源相关对CPU性能的影响,讨论解决资源相关的方法。
4.在不采用定向技术的情况下(去掉Configuration菜单中EnableForwarding选项前的勾选符),用WinDLX运行程序data_d.s。
记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。
5.在采用定向技术的情况下(勾选EnableForwarding),用WinDLX再次运行程序data_d.s。
重复上述3中的工作,并计算采用定向技术后性能提高的倍数。
实验步骤与结果分析
用WinDLX模拟器执行求阶乘程序fact.s
首先,根据实验指导书上的步骤,打开fact.s和input.s,然后开始运行程序。
打开后,可以看到当前的pipeline图。
该图指出了每个功能段所进行的具体指令,点击指令还可以看到指令的具体相关的其他方面的内容。
该图更加直观的形式显示出了在某个时间周期某个功能段所执行的具体的指令。
该图指出了各个寄存器和存储器的值。
该图指出了指令的相关分析数据。
该图显示了执行结果。
由于运行方式相同,下面两个例子,只给出执行结果。
2.用WinDLX运行程序structure_d.s
运行如下图:
资源相关的指令:
adddf0,f0,f4
adddf2,f0,f2
发生先写后读的数据相关导致消除了结构相关。
资源相关的部件:
faddEX
下图为单条指令资源冲突图:
暂停时钟周期数:
139个
暂停时钟周期数占总执行周期数的百分比:
6/139=4.3%
解决资源相关的方法:
停顿几个时钟周期法(针对访存冲突和设备资源冲突(轮流单个使用))或者是增加硬件设备(解决设备资源冲突)。
下图为数据分析图:
3.在不采用定向技术的情况下,用WinDLX运行程序data_d.s。
总时钟周期=202
数据相关引起的暂停时钟周期=104
暂停时钟周期数占总执行周期数的百分比=51.48%
如下图所示:
4.在采用定向技术的情况下,用WinDLX运行程序data_d.s。
总时钟周期=128
数据相关引起的暂停时钟周期=30
暂停时钟周期数占总执行周期数的百分比=23.44%
如下图所示:
实验结论
通过使用WinDlX对指令模拟与分析,我们对流水线的执行过程更加熟悉,也对执行时出现的问题,如资源相关,数据相关等产生原因有了清晰的认识,进一步加深了使我们对流水线的理解。
实验二循环展开和指令调度
实验原理:
1、由于相关的存在,使得指令中的下一条指令不能在指定的时钟周期执行。
流水线冲突会给指令在流水线中的执行带来许多问题,如果不能很好地解决冲突问题,轻则影响流水线的性能,重则导致错误的执行结果。
而对于各种冲突,都有可能用指令调度来解决。
2、到目前为止,几乎所有的处理器都利用流水线来使指令重叠并行执行,以达到提高性能的目的。
这种指令之间存在的潜在并行性称为指令级并行。
增加指令之间的并行性最简单的和最常用的方法,是开发循环的不同迭代之间存在的并行性。
在把循环展开后,通过重命名和指令调度来开发更多的并行性,这样就可以充分发挥流水线的作用。
实验目的:
1、加深对循环并行性、指令调度技术、循环展开技术以及寄存器换名技术的理解;
2、熟悉用指令调度技术来解决流水线中的数据相关的方法;
3、了解循环展开、指令调度等技术对CPU性能的改进。
实验内容:
1、用指令调度技术解决流水线中的结构相关与数据相关。
2、用循环展开、寄存器换名以及指令调度提升性能。
实验器材(设备、元器件)及平台:
装有WinDLX模拟器的PC微型机一台,平台即为WinDLX模拟器。
实验步骤及操作:
一、用指令调度技术解决流水线中的结构相关与数据相关:
(1)用DLX汇编语言编写代码文件,命名为instruction.s,程序中包括数据相关与结构相关(假设:
加法、乘法、除法部件各有两个,延迟时间都是3个时钟周期)。
(2)通过Configiguration菜单中的“Flouatingpointstages”选项,把加法、乘法、除法部件的个数设置为2个,把延迟都设置为3个时钟周期。
(3)用WinDLX运行程序。
记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总的时钟周期数。
(4)采用指令调度技术对程序进行指令调度,消除相关。
(5)用WinDLX运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数。
(6)根据记录结果,比较调度前和调度后的性能。
论述指令调度对于提高CPU性能的意义。
二、用循环展开、寄存器换名以及指令调度提高性能:
(1)用DLX汇编语言编写代码文件,命名为test.s,程序中包含一个循环次数为4的整数倍的简单循环。
(2)用WinDLX运行该程序。
记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数。
(3)将循环展开3次,将4个循环体组成的代码替换原来的循环体,并对程序做相应的修改。
然后对新的循环体进行寄存器换名和指令调度。
(4)用WinDLX运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总的时钟周期。
(5)根据记录结果,比较循环展开、指令调度前后的性能。
实验数据及结果分析:
一、用指令调度技术解决流水线中的结构相关与数据相关:
1、instruction.s文件的代码:
2、运行程序部分截图
3、未用指令调度技术之前程序执行过程中的相关:
4、运行结果数据统计
5、采用指令调度后的程序代码
6、采用调度技术后发生的关联
7、运行结果数据统计
二、用循环展开、寄存器换名以及指令调度提高性能:
1、test.s文件的源代码如下:
2、运行test.s文件,记录运行过程中存在的相关,以及运行总的时钟周期数
3、将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。
然后对新的循环体进行寄存器换名和指令调度,代码如下:
4、记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数:
实验结论:
一、用指令调度技术解决流水线中的结构相关与数据相关
采用指令调度之前:
相关名
相关次数
所占比例
RAWstalls
9
33%
WAWstalls
0
0
Structuralstalls
1
3.7%
Controlstalls
0
0
Trapstalls
7
25.92%
Total
17
采用循环调度前程序执行的过程中各种相关发生的次数如上表所示。
发生相关的指令组合如实验数据中的截图所示。
程序执行总的时钟周期数是27。
根据上述数据计算可得:
吞吐率=10/27=0.37.
采用指令调度之后:
相关名
相关次数
所占比例
RAWstalls
3
14.28
WAWstalls
0
0
Structuralstalls
1
4.76
Controlstalls
0
0
Trapstalls
6
28.57
Total
10
采用循环调度后程序执行过程中各种相关发生的次数如上表所示,发生相关的指令组合如实验数据中的截图所示。
程序执行总的时钟周期数是21。
根据上述数据计算可得:
吞吐率=10/21=0.476
结论:
程序采用指令调度后程序的执行的总的时钟周期数减少了6次。
加速比约为1.3.指令调度技术可以减少程序运行中的相关,能够减少CPU的空闲时间,增加吞吐率,提高CPU的性能。
但是指令调度技术不能将所有的相关都消除。
二、用循环展开、寄存器换名以及指令调度提高性能
采用循环展开、调度之前:
相关名
相关次数
所占比例
RAWstalls
26
31.71%
WAWstalls
0
0
Structuralstalls
0
0
Controlstalls
7
8.54%
Trapstalls
3
3.66%
Total
36
采用循环展开,指令调度以及寄存器换名之前,程序在执行过程中各种相关如上表所示,发生相关的指令组合如实验数据中的截图所示。
程序执行的总时钟周期数是82。
采用循环展开,寄存器换名以及指令调度之后:
相关名
相关次数
所占比例
RAWstalls
2
4.44%
WAWstalls
0
0
Structuralstalls
6
13.33%
Controlstalls
1
2.22%
Trapstalls
3
6.67%
Total
12
采用循环展开,寄存器换名以及指令调度之后,程序在执行的过程中各种相关如上表所示,发生相关的指令组合如实验数据中的截图所示。
程序执行的总的时钟周期数是45.
结论:
程序采用循环展开,指令调度以及寄存器换名后程序的执行的总的时钟周期数减少了37次。
加速比约为1.82.这说明了采用循环展开、指令调度技术和换名技术可以在很大程度上减少程序运行中的相关,能够减少CPU的空闲时间,增加吞吐率,提高CPU的性能。
但是这些技术的结合不能将所有的相关都消除。
实验三Cache性能分析
实验目的
1.加深对Cache的基本概念、基本组织结构以及基本工作原理的理解;
2.了解Cache的容量、相联度、块大小对Cache性能的影响;
3.掌握降低Cache失效率的各种方法,以及这些方法对Cache性能提高的好处;
4.理解Cache失效的产生原因以及Cache的三种失效;
5.理解LRU与随机法的基本思想,及它们对Cache性能的影响;
实验内容
1.在基本配置情况下运行程序(请指明所选的测试程序),统计Cache总失效次数;
2.改变Cache容量(*2,*4,*8,*64),运行程序(指明所选的测试程序),统计各种失效的次数,并分析Cache容量对Cache性能的影响;
3.改变Cache的相联度(1路,2路,4路,8路,64路),运行程序(指明所选的测试程序),统计各种失效的次数,并分析相联度对Cache性能的影响;
4.改变Cache块大小(*2,*4,*8,*64),运行程序(指明所选的测试程序),统计各种失效的次数,并分析Cache块大小对Cache性能的影响;
5.分别采用LRU与随机法,在不同的Cache容量、不同的相联度下,运行程序(指明所选的测试程序)统计Cache总失效次数,计算失效率。
分析不同的替换算法对Cache性能的影响。
实验步骤与结果分析
本实验是cache性能分析,而simplescalar中有很多种cache的参数,我们只需要选其中一种cache来进行分析即可。
在这里,我们选择分析数据cache,即修改并查看dl1的参数。
1.基本配置
基本配置下,直接指定测试程序运行即可。
具体步骤如下。
测试程序:
test-printf
首先,执行指令
得到dl1的结果:
其中,accesses为总访问次数,hits为命中次数,misses为失效次数,replacements为非强制失效的次数。
非强制失效包含容量失效与冲突失效。
即:
访问次数
失效次数
非强制失效次数
强制失效次数
失效率
531424
707
451
256
0.13%
测试程序:
test-math
首先,执行指令
得到结果:
即:
访问次数
失效次数
非强制失效次数
强制失效次数
失效率
57466
804
548
256
1.40%
使用同样方法,可以得出所有程序的运行状况。
具体情况如下表:
测试程序
访问次数
失效次数
非强制失效次数
强制失效次数
失效率
test-printf
531424
707
451
256
0.13%
test-math
57466
804
548
256
1.40%
test-fmath
16639
578
322
256
3.47%
test-llong
10473
479
223
256
4.57%
test-lswlr
4728
459
203
256
9.71%
可见,不论运行什么程序,强制失效次数都是一样的。
由于强制失效是数据第一次被访问时所导致的失效,因此总数应当与cache容量相同。
可见,cache容量默认值为256。
另外可以看出,程序的访问次数越多,则失效率会倾向于越少。
2.改变Cache容量(*2,*4,*8,*64)
以下内容以16:
8:
1:
l为基准,分别列出原结果、Cache容量*2,*4,*8,*64后fmath的运行结果。
所有参数设置如下:
Cache容量
参数
描述
基准
16:
8:
1:
l
16组,每组1块,每块8字节
*2
32:
8:
1:
l
32组,每组1块,每块8字节
*4
64:
8:
1:
l
64组,每组1块,每块8字节
*8
128:
8:
1:
l
128组,每组1块,每块8字节
*64
1024:
8:
1:
l
1024组,每组1块,每块8字节
a)./simplesim-3.0/sim-cache-cache:
dl1dl1:
16:
8:
1:
ltest-fmath
b)./simplesim-3.0/sim-cache-cache:
dl1dl1:
32:
8:
1:
ltest-fmath
c)./simplesim-3.0/sim-cache-cache:
dl1dl1:
64:
8:
1:
ltest-fmath
d)./simplesim-3.0/sim-cache-cache:
dl1dl1:
128:
8:
1:
ltest-fmath
e)./simplesim-3.0/sim-cache-cache:
dl1dl1:
1024:
8:
1:
ltest-fmath
结果如下表所示:
Cache容量
访问次数
失效次数
非强制失效次数
强制失效次数
失效率
基准值
16639
4706
4690
16
28.28%
*2
16639
3610
3578
32
21.70%
*4
16639
2868
2804
64
17.24%
*8
16639
2220
2092
128
13.34%
*64
16639
1844
820
1024
11.08%
使用同样方法和参数,测试test-math的情况,最后结果汇总如下:
分析test-fmath的测试数据,结果如下:
分析test-math的测试数据,结果如下:
从两个图中可以看出,增加cache容量会减少失效的次数。
虽然容量变大会增加强制失效的次数,但由于之后在访问cache时,若cache容量较大,可以显著降低不命中的概率,因此会使非强制失效的次数大幅减少,从而降低总的失效次数与失效率。
3.改变Cache的相联度(1路,2路,4路,8路,64路)
以下内容以1024:
8:
1:
l为基准,分别列出原结果、Cache相联度*2,*4,*8,*64后test-printf,test-llong,test-lswlr的运行结果。
所有参数设置如下:
Cache相联度
参数
描述
1路
1024:
8:
1:
l
1024组,每组1块,每块8字节
2路
512:
8:
2:
l
512组,每组2块,每块8字节
4路
256:
8:
4:
l
256组,每组4块,每块8字节
8路
128:
8:
8:
l
128组,每组8块,每块8字节
64路
16:
8:
64:
l
16组,每组64块,每块8字节
测试结果如下:
分析test-printf的测试数据,结果如下:
分析test-llong的测试数据,结果如下:
可以看出,改变cache相联度总的来说对命中率影响不大。
在总访问次数较多的程序(如test-printf)中可以看出相联度在1、2、4时有细微的差别,而相联度超过4时则对命中率影响较小。
在总访问次数较少的程序(如test-lswlr)中,相联度不同甚至不会对失效次数产生影响。
4.改变Cache块大小(*2,*4,*8,*64)
以下内容以1024:
8:
1:
l为基准,分别列出原结果、Cache相联度*2,*4,*8,*64后fmath的运行结果。
所有参数设置如下:
Cache块大小
参数
描述
基准值
1024:
8:
1:
l
1024组,每组1块,每块8字节
*2
512:
16:
1:
l
512组,每组1块,每块16字节
*4
256:
32:
1:
l
256组,每组1块,每块32字节
*8
128:
64:
1:
l
128组,每组1块,每块64字节
*64
16:
512:
1:
l
16组,每组1块,每块512字节
测试结果如下:
分析test-math的测试数据,结果如下:
分析test-lswlr的测试数据,结果如下:
可见,随着cache块大小的增加,强制失效次数、非强制失效次数均有减少。
容易推出,由于cache每块的大小增加,而cache总容量不变,因此cache的总块数有所减少,从而使强制失效次数减少。
另外,由于访问内存时需要获取的块不再像以前那样混杂,而是让很多块的内容能够在一个块里获取,因此非强制失效次数也有所减少。
值得一提的是,可能因为cache块大小为512字节时超出了范围,因此*64一栏程序的输出数据失效。
实验小结