计算机系统结构实验报告
学
姓
号:
名:
指导老师:
完成日期:
实验一 流水线中的相关
一、实验目的
1. 掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;
2. 加深对计算机流水线基本概念的理解;
3. 进一步了解DLX基本流水线各段的功能以及基本操作;
4. 加深对数据相关、结构相关的理解,了解这两类相关对CPU性能的影响;
5. 了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停。
二、实验平台
WinDLX模拟器。
三、实验内容、步骤及结果
1.用WinDLX模拟器执行下列三个程序:
a、求阶乘程序fact.s
b、求最大公倍数程序gcm.s
c、求素数程序prim.s
分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察
CPU中寄存器和存储器的内容。熟练掌握WinDLX的操作和使用。
a、求阶乘程序fact.s
该图指出了每个功能段所进行的具体指令,点击指令还可以看到指令的具体相关的其他
方面的内容。
该图更加直观的形式显示出了在某个时间周期某个功能段所执行的具体的指令。
该图指出了各个寄存器和存储器的值。
该图指出了指令的相关分析数据。
该图显示了执行结果。
由于运行方式相同,下面两个例子,只给出执行结果。
b、求最大公倍数程序gcm.s
c、求素数程序prim.s
2.用 WinDLX 运行程序 structure_d.s,通过模拟找出存在资源相关的指令对以及导致资
源相关的部件;记录由资源相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期
数的百分比;论述资源相关对 CPU 性能的影响,讨论解决资源相关的方法。
运行如下图:
资源相关的指令:addd f0,f0,f4
addd f2,f0,f2
发生先写后读的数据相关导致消除了资源相关。
资源相关的部件:faddEX
下图为单条指令资源冲突图:
暂停时钟周期数:139 个
暂停时钟周期数占总执行周期数的百分比:6/139 = 4.3%
解决资源相关的方法:停顿几个时钟周期法(针对访存冲突和设备资源冲突(轮流单个使用))
或者是增加硬件设备(解决设备资源冲突)。
下图为数据分析图:
3.在不采用定向技术的情况下(去掉Configuration菜单中Enable Forwarding选项前的勾选
符),用WinDLX运行程序data_d.s。记录数据相关引起的暂停时钟周期数以及程序执行的总
时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。在采用定向技术的情况下(勾
选Enable Forwarding),用WinDLX再次运行程序data_d.s。重复上述3中的工作,并计算采
用定向技术后性能提高的倍数。
a、不定向技术:
总时钟周期=202
数据相关引起的暂停时钟周期=104
暂停时钟周期数占总执行周期数的百分比=51.48%
如下图所示:
b、定向技术:
总时钟周期=128
数据相关引起的暂停时钟周期=30
暂停时钟周期数占总执行周期数的百分比=23.44%
如下图所示:
四、心得体会
通过使用WinDlX对指令模拟与分析,我们对流水线的执行过程更加熟悉,也对执行时出
现的问题,如资源相关,数据相关等产生原因有了清晰的认识,进一步加深了使我们对流水
线的理解。
实验二 循环展开及指令调度
一、实验目的
1.加深对循环级并行性、指令调度技术、循环展开技术及寄存器换名技术的理解;
2.熟悉用指令调度技术来解决流水线中的数据相关的方法;
3.了解循环展开、指令调度等技术对CPU性能的改进。
二、实验平台
WinDLX模拟器。
三、实验内容、步骤及结果
1.用指令调度技术解决流水线中的结构相关与数据相关
(1)用DLX汇编语言编写代码文件*.s,程序中应包括数据相关与结构相关(假设:加法﹑
乘法﹑除法部件各有2个,延迟时间都是3个时钟周期)
(2)通过Configuration菜单中的“Floating point stages” 选项,把加法﹑乘法﹑除法部件的
个数设置为2个,把延迟都设置为3个时钟周期;
(3)用WinDLX运行程序。记录程序执行过程中各种相关发生的次数、发生相关的指令组
合,以及程序执行的总时钟周期数;
(4)采用指令调度技术对程序进行指令调度,消除相关;
(5)用WinDLX运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总
时钟周期数;
(6)根据记录结果,比较调度前和调度后的性能。论述指令调度对于提高CPU性能的意义。
(1)代码文件*.s
.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
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)
;floating-point format