计算机体系结构实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一流水线中的相关
一.实验目的
1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;
2. 加深对计算机流水线基本概念的理解;
3. 进一步了解DLX基本流水线各段的功能以及基本操作;
4. 加深对数据相关、结构相关的理解,了解这两类相关对CPU性能的影响;
5. 了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停。

二.实验平台
WinDLX模拟器
三.预备知识
1. WinDLX
WinDLX模拟器是一个图形化、交互式的DLX流水线模拟器,能够演示DLX流水线
是如何工作的。

该模拟器可以装载DLX汇编语言程序(后缀为“.s”的文件),然后单步、设断点或是连续执行该程序。

CPU的寄存器、流水线、I/O和存储器都可以用图形表示出来,以形象生动的方式描述DLX流水线的工作过程。

模拟器还提供了对流水线操作的统计功能,便于对流水线进行性能分析。

有关WinDLX的详细介绍,见WinDLX教程。

2. 熟悉WinDLX指令集和WinDLX源代码的编写
3. 复习和掌握教材中相应的内容
(1)DLX基本流水线
(2)流水线的结构相关与数据相关
结构相关:当指令在重叠执行过程中,硬件资源满足不了指令重叠执行的要求,
发生资源冲突时,将产生“结构相关”。

数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中
重叠执行时,就可能引起“数据相关”。

(3)定向技术的主要思想:在发生数据相关时,等待前面计算结果的指令并不一定真的马上就用到该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令
需要它的地方,就可以避免暂停。

四.实验内容及结果
1. 用 WinDLX 模拟器执行下列三个程序(任选一个):
求阶乘程序 fact.s
求最大公倍数程序 gcm.s
求素数程序 prim.s
分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,
观察CPU 中寄存器和存储器的内容。

熟练掌握WinDLX 的操作和使用。

注意:fact.s 中调用了input.s 中的输入子程序。

load 程序时,要两个程序一起装入(都select 后再点击load)。

gcm.s 也是如此。

说明:此实验我们选择:求阶乘程序fact.s
1)用WinDLX模拟器执行求阶乘程序fact.s。

2)程序的作用:这个程序说明浮点指令的使用。

该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。

该程序中调用了input.s中的输入子程序,这个子程序用于读入正整数。

3)实验结果:
i . 分别以步进、连续、设置断点的方式运行程序
图1. 求阶乘程序fact.s运行统计数据步进方式运行
图2 求阶乘程序fact.s运行统计数据连续方式运行
ii. 数据统计
图1.1.4 求阶乘程序fact.s运行统计数据
图5 求阶乘程序fact.s流水线执行情况
图6 求阶乘程序fact.s寄存器使用情况
iii. 定向非定向分析
在载入fact.s和input.s之后,不设置任何断点运行。

A. 不采用重新定向技术,我们得到的结果:
B. 采用定向技术,我们得到的结果:
结果分析
从上面的数据我们可以看出定向的作用:
在定向技术存在的情况下Statistics 窗口中的各种统计数字:总的周期数(215) 和暂停数(17 RAW, 25 Control, 12 Trap; 54 Total)
在定向技术不存在时候,控制暂停和Trap 暂停仍然是同样的值,而RAW暂停从17变成了53,总的模拟周期数增加到236。

所以定向技术带来的加速比:S=236 / 215 = 1.098
因此:DLX forwarded比DLX not forwarded快9.8%。

2. 用WinDLX 运行程序structure_d.s,通过模拟:
找出存在结构相关的指令对以及导致结构相关的部件;
记录由结构相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期数的百分比;
论述结构相关对CPU 性能的影响,讨论解决结构相关的方法。

1)模拟结果:
图2.1 程序structure_d.s流水线执行过程
2)结构相关
i. 如图,导致结构的部件:浮点数寄存器f4
addd f0,f0,f4 指令在译码阶段ID停滞1周期
ii. 如图导致结构相关的部件:ALU
addi r2,r2,0x8 指令在执行阶段intEX停滞1周期
3)结果分析
由资源相关引起的暂停周期数为:30
总执行周期数为:139
暂停周期数占总执行周期数的百分比:21.58%
分析:资源相关使相关指令在流水线上停滞,降低了执行效率。

4)解决办法
在合理的指令调度范围内,尽量避免执行重复的指令。

尽量避免同一寄存器的频繁使用,若无法避免,则使用寄存器换名的方法。

也可以考虑采用资源重复的方法,比如,在流水线机器中设置相互独立的指令存储器和数据存储器,也可以将CACHE 分割成指令CACHE 和数据CACHE。

3. 在不采用定向技术的情况下(去掉Configuration 菜单中Enable Forwarding 选项前的勾选符),用WinDLX 运行程序data_d.s。

记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。

1)实验结果:
没有采用定向技术时运行该程序,我们得到:
2)结果分析:
程序执行了202个周期,10个数据相关引起的时钟周期RAW stall为104个。

暂停时钟
周期数占总执行周期数的百分比=51.48%
4. 在采用定向技术的情况下(勾选Enable Forwarding),用WinDLX 再次运行程序data_d.s。

重复上述3 中的工作,并计算采用定向技术后性能提高的倍数。

1)实验结果:
采用定向技术时运行该程序,我们得到:
2)结果分析:
程序执行了128个周期,共有6个数据相关引起的时钟周期RAW stall为30个。

暂停时
钟周期数占总执行周期数的百分比=23.44%
五.总结
实验二循环展开及指令调度
一.实验目的
1. 加深对循环级并行性、指令调度技术、循环展开技术以及寄存器换名技术的理解;
2. 熟悉用指令调度技术来解决流水线中的数据相关的方法;
3. 了解循环展开、指令调度等技术对 CPU 性能的改进。

二.实验平台
WinDLX simulator
四.预备知识
1. WinDLX模拟器的相关知识,详见相关的文档。

2. 复习和掌握教材中相应的内容:
(1)循环级并行性
(2)指令调度
(3)循环展开
(4)寄存器换名
五.实验内容及结果
1.用指令调度技术解决流水线中的结构相关与数据相关
(1)用DLX汇编语言编写代码文件*.s,程序中应包括数据相关与结构相关(假设:加法﹑乘法﹑除法部件各有2个,延迟时间都是3个时钟周期)
给出调度前的程序sch_bef:
.data
.global ONE
ONE: .word 1
.text
.global main
main:
lf f1,ONE ;turn divf into a move
cvti2f f7,f1 ;by storing in f7 1 in
nop ;floating-point format
divf f1,f8,f7 ;move Y=(f8) into f1
divf f2,f9,f7 ;move Z=(f9) into f2
addf f3,f1,f2
divf f10,f3,f7 ;move f3 into X=(f10)
divf f4,f11,f7 ;move B=(f11) into f4
divf f5,f12,f7 ;move C=(f12) into f5
multf f6,f4,f5
divf f13,f6,f7 ;move f6 into A=(f13)
Finish:
trap 0
(2)通过Configuration菜单中的“Floating point stages”选项,把加法﹑乘法﹑除法部件的个数设置为2个,把延迟都设置为3个时钟周期;
(3)用WinDLX运行程序。

记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总时钟周期数;
(4)采用指令调度技术对程序进行指令调度,消除相关;
调度之后的程序sch_aft:
.data
.global ONE
ONE: .word 1
.text
.global main
main:
lf f1,ONE ;turn divf into a move
cvti2f f7,f1 ;by storing in f7 1 in
nop ;floating-point format
divf f1,f8,f7 ;move Y=(f8) into f1
divf f2,f9,f7 ;move Z=(f9) into f2
divf f4,f11,f7 ;move B=(f11) into f4
divf f5,f12,f7 ;move C=(f12) into f5
addf f3,f1,f2
multf f6,f4,f5
divf f10,f3,f7 ;move f3 into X=(f10)
divf f10,f3,f7 ;move f3 into X=(f10)
divf f13,f6,f7 ;move f6 into A=(f13)
Finish:
trap 0
(5)用WinDLX运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数;
(6)根据记录结果,比较调度前和调度后的性能。

论述指令调度对于提高CPU性能的意义。

意义:可以看出经过调度之后运行周期从27减少到21,而且减少了相关。

2. 用循环展开、寄存器换名以及指令调度提高性能
(1)用DLX汇编语言编写代码文件*.s,程序中包含一个循环次数为4的整数倍的简单循环;循环展开前的程序:
LHI R2, (A>>16)&0xFFFF
ADDUI R2, R2, A&0xFFFF
LHI R3, (B>>16)&0xFFFF
ADDUI R3, R3, B&0xFFFF
ADDU R4, R0, R3
NOP
loop:
SUBI R4, R4, #8
SUB R5, R4, R2
BNEZ R5, loop
TRAP #0
A: .double 1, 2, 3, 4
B: .double 1, 2, 3, 4
(2)用WinDLX运行该程序。

记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;
(3)将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。

然后对新的循环体进行寄存器换名和指令调度;
循环展开后的程序:
LHI R2, (A>>16)&0xFFFF
ADDUI R2, R2, A&0xFFFF
LHI R3, (B>>16)&0xFFFF
ADDUI R3, R3, B&0xFFFF
ADDU R4, R0, R3
SUBI R4, R4, #8
SUBI R4, R4, #8
SUBI R4, R4, #8
SUBI R4, R4, #8
TRAP #0
A: .double 1, 2, 3, 4
B: .double 1, 2, 3, 4
(4)用WinDLX运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;
(5)根据记录结果,比较循环展开、指令调度前后的性能。

结论:可以看出经过循环展开之后运行周期从30减少到14,而且减少了相关。

五.总结
实验三记分牌算法和Tomasulo 算法
一.实验目的
1. 掌握DLXview 模拟器的使用方法;
2. 进一步理解指令动态调度的基本思想,了解指令动态调度的基本过程与方法;
3. 理解记分牌算法和Tomasulo 算法的基本思想,了解它们的基本结构、运行过程;
4. 比较分析基本流水线与记分牌算法和Tomasulo 算法的性能及优缺点。

二.实验平台
DLXview 模拟器
三.预备知识
1. DLXview 模拟器
2. 复习和掌握教材中相应的内容 1)指令的动态调度 2)乱序流水线
3)为了允许乱序执行,我们将基本流水线的译码阶段再分为两个阶段:
4)记分牌技术的目标:在资源充足时,尽可能早地执行没有数据阻塞的指令,达到每个 时钟周期执行一条指令。

5)Tomasulo 算法将记分牌的关键部分和寄存器换名技术结合在一起,其基本核心是通过 寄存器换名来消除写后写和先读后写相关可能引发的流水线阻塞。

6)Tomasulo 算法的基本思想
四.实验内容及结果
1. 用DLX 汇编语言编写代码文件*.s (程序中应包括指令的数据相关、控制相关以及结构相关),以及相关的初始化寄存器文件*.i 和数据文件*.d ;
305.s 305.i
2. 观察程序中出现的数据相关、控制相关、结构相关,并指出三种相关的指令组合; (1) 第二个lf 指令到multf 、subf 和addf ,multf 到divf 之间,subf 到addf 之间存在着先
写后读相关。

(2) divf 和addf 之间存在着先读后写相关。

(3) addf 和subf 指令关于浮点加法部件还存在着结构相关。

3. 将自己编写的程序*.s 、*.i 、*.d 装载到DLXview 模拟器上,
(1)分别用基本流水线、记分牌算法和Tomasulo 算法模拟,针对每一种模拟做如下分析: 基本流水线:

1统计程序的执行周期数和流水线中的暂停时钟周期数 #put 30 into r2 -> #34(r2) is 64 (0x40) put r2 30 #put 2.5 into address 0x40 fput 0x40 2.5
#put 23 into r3 -> #45(r3) is 68 (0x41) put r3 23 #put 4.0 into address 68 fput 0x41 4.0 #put 1.25 into FP register f4 fput f4 1.25 lf f6, 34(r2) lf f2, 45(r3) multf f0, f2, f4 subf f8, f6, f2 divf f10,f0, f6 addf f6, f8, f2 trap #0
1个加法部件,延迟周期为2
2个乘法部件,延迟周期为10
1个除法部件,延迟周期为40
程序执行时钟周期数67,流水线中的暂停时钟周期10
②改变功能部件数目重新模拟,观察并记录性能的改变
2个加法部件,延迟周期为2
3个乘法部件,延迟周期为10
2个除法部件,延迟周期为40
程序执行时钟周期数67,流水线中的暂停时钟周期10
③改变功能部件延迟重新模拟,观察并记录性能的改变
1个加法部件,延迟周期为1
2个乘法部件,延迟周期为8
1个除法部件,延迟周期为32
程序执行时钟周期数47,流水线中的暂停时钟周期8 由此可见增加功能部件数目之后,性能并没有提高
减少功能部件延迟之后,性能得到了显著的提高。

记分牌算法:
○1统计程序的执行周期数和流水线中的暂停时钟周期数1个加法部件,延迟周期为2
2个乘法部件,延迟周期为10
1个除法部件,延迟周期为40
程序执行时钟周期数59,流水线中的暂停时钟周期12
②改变功能部件数目重新模拟,观察并记录性能的改变
2个加法部件,延迟周期为2
3个乘法部件,延迟周期为10
2个除法部件,延迟周期为40
程序执行时钟周期数59,流水线中的暂停时钟周期12
③改变功能部件延迟重新模拟,观察并记录性能的改变
1个加法部件,延迟周期为1
2个乘法部件,延迟周期为8
1个除法部件,延迟周期为32
程序执行时钟周期数49,流水线中的暂停时钟周期10 由此可见增加功能部件数目之后,性能并没有提高
减少功能部件延迟之后,性能得到了显著的提高。

Tomasulo算法:
○1统计程序的执行周期数和流水线中的暂停时钟周期数1个加法部件,延迟周期为2
2个乘法部件,延迟周期为10
1个除法部件,延迟周期为40
程序执行时钟周期数56,流水线中的暂停时钟周期10
②改变功能部件数目重新模拟,观察并记录性能的改变
2个加法部件,延迟周期为2
3个乘法部件,延迟周期为10
2个除法部件,延迟周期为40
程序执行时钟周期数56,流水线中的暂停时钟周期10
③改变功能部件延迟重新模拟,观察并记录性能的改变
1个加法部件,延迟周期为1
2个乘法部件,延迟周期为8
1个除法部件,延迟周期为32
程序执行时钟周期数46,流水线中的暂停时钟周期8 由此可见增加功能部件数目之后,性能并没有提高
减少功能部件延迟之后,性能得到了显著的提高。

(2)记录运行记分牌算法时的功能部件状态表和指令状态表;
(3)记录运行Tomasulo算法时的指令状态表和保留站信息;
实验四 Cache 性能分析
一.实验目的
1. 加深对 Cache 的基本概念、基本组织结构以及基本工作原理的理解;
2. 掌握 Cache 容量、相联度、块大小对Cache 性能的影响;
3. 掌握降低 Cache 不命中率的各种方法以及这些方法对提高Cache 性能的好处;
4. 理解 LRU 与随机法的基本思想以及它们对Cache 性能的影响。

二.实验平台
Cache 模拟器MyCache
三.预备知识
MyCache 模拟器使用方法
1. 启动模拟器:用鼠标双击MyCache.exe。

2. 系统会打开一个操作界面。

该界面的左边为设置模拟参数区域,右边为模拟结果显示区域。

如图1 所示。

3. 可以设置的参数包括:是统一Cache 还是分离Cache,Cache 的容量,块大小,相联度,替换算法,预取策略,写策略,写不命中时的调块策略。

可以直接从列表里选择。

4. 访问地址可以选择来自地址流文件,也可以选择手动输入。

如果是前者,则可以通过点击“浏览”按钮,从模拟器所在文件夹下面的“地址流”文件夹中选取地址流文件(.din 文件),然后进行执行。

执行的方式可以是步进,也可以是一次执行到底。

如果选择手动输入,就可以在“执行控制”区域中输入块地址,然后点击“访问”按钮。

系统会在界面的右边显示访问类型、地址、块号以及块内地址。

5. 模拟结果包括:
(1)访问总次数,总的不命中次数,总的不命中率;
(2)读指令操作的次数,其不命中次数及其不命中率;
(3)读数据操作的次数,其不命中次数及其不命中率;
(4)写数据操作的次数,其不命中次数及其不命中率;
(5)手动输入单次访问的相关信息。

图 1 MyCache 模拟器的操作界面示意图
四.实验内容及结果
1. Cache 容量对不命中率的影响
1)启动 MyCache。

2)用鼠标点击“复位”按钮,把各参数设置为默认值。

3)选择一个地址流文件。

方法:选择“访问地址”下的“地址流文件”选项,然后点击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。

4)选择不同的Cache 容量,包括:2KB,4KB,8KB,16KB,32KB,64KB,128KB,256KB,
分别执行模拟器(点击“执行到底”按钮),然后在表1 中记录各种情况下的不命中率。

表 1 不同容量下Cache 的不命中率 Cache 容量(kb
) 2
4
8
16
32
64
128
256
不命中率
14.22% 10.46% 7.59% 4.78% 2.84% 1.97% 1.26% 0.98%
地址流文件名:cc1.din
5)以容量为横坐标,画出不命中率随Cache 容量变化而变化的曲线。

并指明地址流文件名。

6) 根据该模拟结果,你能得出什么结论?
结论:在其他变量一定的情况下,随着Cache 容量的变大不命中率逐渐减小最后趋于稳定。

2. 相联度对不命中率的影响
1) 用鼠标点击“复位”按钮,把各参数设置为默认值。

这时的 Cache 容量为64KB 。

2) 选择一个地址流文件。

方法:选择“访问地址”下的“地址流文件”选项,然后点击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。

3) 选择不同的Cache 相联度,包括:直接映象,2 路,4 路,8 路,16 路,32 路,分别执行模拟器(点击“执行到底”按钮),然后在表 2 中记录各种情况下的不命中率。

a.部分截图:
表 2 当容量为64KB 时,不同相联度下Cache 的不命中率
相联度 1 2 4 8 16 32
不命中率 1.97% 1.15% 0.99% 0.93% 0.92% 0.91%
地址流文件名:cc1.din
4) 把 Cache 的容量设置为256KB,重复上一步的工作。

表 3 当容量为256KB 时,不同相联度下Cache 的不命中率
相联度 1 2 4 8 16 32
不命中率0.98% 0.78% 0.74% 0.73% 0.71% 0.71%
地址流文件名:cc1.din
5) 以相联度为横坐标,画出在64KB 和256KB 的情况下不命中率随Cache 相联度变化而变
化的曲线。

并指明地址流文件名。

6. 根据该模拟结果,你能得出什么结论?
结论:当cache 容量一定时,不命中率先是随着相联度地增加而减小的的,但增加到一定程度后,不命中率不会再降低。

当相联度相同,相联度较小时,cache 容量越大不命中率就越低,但当相联度到达一定程度时,再增大cache 容量就没有任何意义。

3. Cache 块大小对不命中率的影响
1) 用鼠标点击“复位”按钮,把各参数设置为默认值。

2) 选择一个地址流文件。

方法:选择“访问地址”下的“地址流文件”选项,然后点击“浏 览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。

3) 选择不同的Cache 块大小,包括:16B ,32B ,64B ,128B ,256B ,对于Cache 的各种 容量,包括:2KB ,8KB ,32KB ,128KB ,512KB ,分别执行模拟器(点击“执行到底”按钮),然后在表 4 中记录各种情况下的不命中率。

a.部分截图:
表 4 各种块大小情况下Cache 的不命中率
eg.din
块大小(B)
Cache 容量(KB ) 2 8 32 128 512 16 7.80% 7.40% 7.20% 7.20% 7.20% 32 5.4% 5% 4.7% 4.7% 4.7% 64 4.0% 3.4% 3.1% 3.1% 3.1% 128 4.4% 3.3% 2.4% 2.4% 2.4% 256
6.5%
5.1% 2.3% 1.9% 1.9%
地址流文件名:eg.din
4) 分析 Cache 块大小对不命中率的影响。

结论:在Cache 容量不变的情况下,Cache 块越大不命中率越小,最后趋于平缓。

4. 替换算法对不命中率的影响
1) 用鼠标点击“复位”按钮,把各参数设置为默认值。

2)选择一个地址流文件。

方法:选择“访问地址”下的“地址流文件”选项,然后点击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。

3) 对于不同的替换算法、Cache 容量和相联度,分别执行模拟器(点击“执行到底”按钮),然后在表 5 中记录各种情况下的不命中率。

a.部分截图:
(cache容量:16KB 相联度:2路采用LRU算法)
(cache容量:16KB 相联度:2路采用随机算法)
表 5 LRU 和随机替换法的不命中率的比较
cache容量
相连度
2路4路8路
LRU 随机算法LRU 随机算法LRU 随机算法
16K 3.62% 4.50% 2.96% 4.71% 2.74% 5.43% 64K 1.15% 1.47% 0.99% 1.36% 0.93% 1.42% 256K 0.78% 0.83% 0.74% 0.76% 0.73% 0.72% 1M 0.71% 0.71% 0.70% 0.70% 0.70% 0.70%
地址流文件名:cc1.din
4) 分析不同的替换算法对Cache 不命中率的影响。

结论:i.LRU和随机算法的不命中率随着相联度的增加而减少且随着cache容量的增加而减少; ii.在相联度相同,cache容量相同时,使用LRU替换算法的不命中率比随机算法的不命中率小; iii.当cache容量增大到一定程度,相联度达到一定程度时,不命中率不会再降低,且与算法的选择关系不大。

5. 混合Cache 和分离Cache 的比较
1) 用鼠标点击“复位”按钮,把各参数设置为默认值。

2) 选择一个地址流文件。

方法:选择“访问地址”下的“地址流文件”选项,然后点击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。

3) 分别在分离Cache 和混合Cache 的情况下,选择不同的Cache 容量,包括: 4KB,8KB,16KB,32KB,64KB,128KB,256KB,分别执行模拟器(点击“执行到底”按钮),
然后在表 6 中记录各种情况下的不命中率。

a.部分截图:
(Cache容量:4KB 混合Cache)
(Cache容量:4KB 分离Cache)
表 6 分离Cache 和混合Cache 不命中率的比较
容量指令cache 数据cache 混合cache
4 5.53% 7.06% 5.40%
8 5.53% 7.06% 5.00%
16 5.53% 6.29% 4.70%
32 5.53% 5.86% 4.70%
64 5.53% 5.86% 4.70%
128 5.53% 5.86% 4.70%
256 5.53% 5.86% 4.70%
地址流文件名:eg.din
4) 对模拟结果进行分析。

结论:分离Cache 较混合Cache 的不命中率较低,这是因为混合Cache按流水的方式执行load指令和store指令时,可能会同时请求一个数据字和一个指令字,这时会出现结构冲突,导致CPU等待。

五.总结。

相关文档
最新文档