计算机系统结构实验报告实验一流水线的相关实验目的:1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;2. 加深对计算机流水线基本概念的理解;3. 进一步了解DLX基本流水线各段的功能以及基本操作;4. 加深对数据相关、结构相关的理解,了解这两类相关对CPU性能的影响;5. 了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停。
实验平台:WinDLX模拟器实验内容和步骤:一.用WinDLX模拟器执行下列三个程序:求阶乘程序fact.s求最大公倍数程序gcm.s求素数程序prim.s分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
熟练掌握WinDLX的操作和使用。
1、求阶乘程序fact.s(1)分别以步进、连续、设置断点的方式运行程序图1.1.1 求阶乘程序fact.s运行统计数据步进方式运行图1.1.2 求阶乘程序fact.s运行统计数据连续方式运行(2)数据统计图1.1.4 求阶乘程序fact.s运行统计数据图1.1.5 求阶乘程序fact.s流水线执行情况图1.1.6 求阶乘程序fact.s寄存器使用情况2、求最大公倍数程序gcm.s图1.2.1 求最大公倍数程序gcm.s运行统计数据图1.2.2 求最大公倍数程序gcm.s流水线执行情况图1.2.3 求最大公倍数程序gcm.s寄存器使用情况3、求素数程序prim.s图1.3.1 求素数程序prim.s运行统计数据图1.3.2 求素数程序prim.s流水线执行情况图1.3.3 求素数程序prim.s寄存器使用情况二、用WinDLX运行程序structure_d.s,通过模拟找出存在资源相关的指令对以及导致资源相关的部件;记录由资源相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期数的百分比;论述资源相关对CPU性能的影响,讨论解决资源相关的方法。
图1.4.1 程序structure_d.s流水线执行过程其中,有如下几种情况,产生了资源相关:(1)导致资源相关的部件:浮点数寄存器f4addd f0,f0,f4 指令在译码阶段ID停滞1周期(2)导致资源相关的部件:ALUaddi r2,r2,0x8 指令在执行阶段intEX停滞1周期图1.4.2 程序structure_d.s运行统计信息由资源相关引起的暂停周期数为:30总执行周期数为:139暂停周期数占总执行周期数的百分比:21.58%分析:资源相关使相关指令在流水线上停滞,降低了执行效率。
解决方法:在合理的指令调度范围内,尽量避免执行重复的指令。
尽量避免同一寄存器的频繁使用,若无法避免,则使用寄存器换名的方法。
3、在不采用定向技术的情况下(去掉Configuration菜单中Enable Forwarding选项前的勾选符),用WinDLX运行程序data_d.s记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。
图1.5.1 不采用定向技术,程序data_d.s运行统计信息由数据相关引起的暂停时钟周期数为:104总执行周期数为:202暂停周期数占总执行周期数的百分比:51.48%在采用定向技术的情况下(勾选Enable Forwarding),用WinDLX再次运行程序data_d.s。
重复上述3中的工作,并计算采用定向技术后性能提高的倍数。
图1.5.2 采用定向技术,程序data_d.s运行统计信息由数据相关引起的暂停时钟周期数为:30总执行周期数为:128暂停周期数占总执行周期数的百分比:23.44%通过这两个统计可以发现,在使用定向技术下运行程序指令将大幅降低数据相关发生的次数,这大幅提升了CPU的性能。
实验二循环展开及指令调度实验目的:1. 加深对循环级并行性、指令调度技术、循环展开技术以及寄存器换名技术的理解;2. 熟悉用指令调度技术来解决流水线中的数据相关的方法;3. 了解循环展开、指令调度等技术对CPU性能的改进。
实验平台:WinDLX模拟器实验内容和步骤:1.用指令调度技术解决流水线中的结构相关与数据相关(1)用DLX汇编语言编写代码文件*.s,程序中应包括数据相关与结构相关(假设:加法﹑乘法﹑除法部件各有2个,延迟时间都是3个时钟周期)程序代码:.data.global ONEONE: .word 1.text.global mainmain:lf f1,ONEcvti2f f7,f1nopdivf f1,f8,f7divf f2,f1,f7divf f13,f2,f7divf f10,f3,f7addf f5,f12,f7addf f3,f1,f2multf f6,f4,f5Finish:trap 0(2)通过Configuration菜单中的“Floating point stages”选项,把加法﹑乘法﹑除法部件的个数设置为2个,把延迟都设置为3个时钟周期;图2.1.1 设置运算器数量及时钟周期(3)用WinDLX运行程序。
记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总时钟周期数;图2.1.2 程序执行统计信息如图,程序总共执行了23个时钟周期,共有12个时钟周期的系统停滞。
经分析,程序执行过程中出现了结构相关:图2.1.3 流水线执行情况如图,在时钟周期-11、-12时,指令divf f13,f2,f7需要在其执行阶段使用除法运算器,而此时两个除法运算器都在使用中,故产生了器件冲突,结构相关导致该指令在译码阶段停滞2个时钟周期。
(4)采用指令调度技术对程序进行指令调度,消除相关;通过指令调度,程序的执行顺序调整为:.data.global ONEONE: .word 1.text.global mainmain:lf f1,ONEcvti2f f7,f1nopdivf f1,f8,f7addf f5,f12,f7multf f6,f4,f5divf f2,f1,f7divf f10,f3,f7addf f3,f1,f2divf f13,f2,f7Finish:trap 0(5)用WinDLX运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数;图2.1.4 指令调度后,程序执行统计信息图2.1.5 指令调度后,流水线执行情况可见,执行总周期数为21,由于器件冲突产生的结构相关已经部分消除。
指令调度后,CPU运行周期是调度前的21/23=0.91倍。
2. 用循环展开、寄存器换名以及指令调度提高性能(1)用DLX汇编语言编写代码文件*.s,程序中包含一个循环次数为4的整数倍的简单循环;程序代码:.datax: .word 1i: .word 4.text.global mainmain: lf f1,xlf f9,imovf f5,f1Loop:eqf f9,f0bfpt Finishaddf f0,f0,f1divf f3,f4,f5j LoopFinish:trap 0(2)用WinDLX运行该程序。
记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;图2.2.1 程序执行统计情况总计执行周期:38总计停滞周期:7图2.2.2 流水线执行情况(3)将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。
然后对新的循环体进行寄存器换名和指令调度;展开后的程序代码:.datax: .word 1i: .word 4.text.global mainmain: lf f1,xlf f9,imovf f5,f1divf f3,f4,f5divf f3,f4,f5divf f3,f4,f5divf f3,f4,f5trap 0(4)用WinDLX运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;图2.2.3 循环展开后,程序执行统计情况总计执行周期:20总计停滞周期:13图2.2.4 循环展开后后,流水线执行情况可见,在相同器件的情况下,指令调度对于提高CPU性能的意义非常重大。
实验三Cache性能分析实验目的:1.加深对Cache的基本概念、基本组织结构以及基本工作原理的理解;2.了解Cache的容量、相联度、块大小对Cache性能的影响;3.掌握降低Cache失效率的各种方法,以及这些方法对Cache性能提高的好处;4.理解Cache失效的产生原因以及Cache的三种失效;5.理解LRU与随机法的基本思想,及它们对Cache性能的影响;实验平台:SimpleScalar模拟器实验内容及步骤: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性能的影响。
测试程序:用于实验的测试程序可以使用现有的,即benchmark目录下的所有程序;也可以自己用C 语言直接生成各类典型程序比如:数学运算类、输入输出类等,通过本环境提供的特定C编译器,编译生成对应的xxx.out(默认是a.out)测试程序用于实验。
每个测试程序所需时间大概是10分钟,选择测试程序时注意从不同组中选择,以便使得出的结果不会因为对单项有所侧重而有失偏颇。
每个人从中选出4~6个测试程序进行测试。
实验内容及步骤:1.在基本配置情况下运行程序(请指明所选的测试程序),统计Cache总失效次数、三种不同种类的失效次数;图3.1.1 默认配置下,Cache的失效次数与统计概率2.改变Cache容量(*2,*4,*8,*64),运行程序(指明所选的测试程序),统计各种失效的次数,并分析Cache容量对Cache性能的影响;(1)-dl1:512:32:1:l (*2)图3.1.2 -dl1:512:32:1:l (*2)配置下,Cache的失效次数与统计概率(2)-dl1:1024:32:1:l (*4)图3.1.3 -dl1:1024:32:1:l (*4)配置下,Cache的失效次数与统计概率(3)-dl1:2048:32:1:l (*8)图3.1.4 -dl1:2048:32:1:l (*8)配置下,Cache的失效次数与统计概率(4)-dl1:16384:32:1:l (*64)图3.1.5 -dl1:16384:32:1:l (*64)配置下,Cache的失效次数与统计概率经分析,扩大Cache容量有助于失效率的降低,提高Cache性能,但在cache集合数达到1024之后并没有明显的变化,这可能是由于饱和造成的。