计算机体系结构实验.docx
《计算机体系结构实验.docx》由会员分享,可在线阅读,更多相关《计算机体系结构实验.docx(12页珍藏版)》请在冰点文库上搜索。
计算机体系结构实验
实验报告
学生姓名:
学号:
时间:
地点:
实验课程名称:
计算机体系结构
一、实验名称:
流水线中的相关-输入位数相同的两个整数,逆序输出同位
上相同的数
二、实验原理:
1、WinDLX
WinDLX模拟器是一个图形化、交互式的DLX流水线模拟器,能够演示DLX流水线是如何工作的。
该模拟器可以装载DLX汇编语言程序(后缀为“.s”的文件),然后单步、设断点或是连续执行该程序。
CPU的寄存器、流水线、I/O和存储器都可以用图形表示出来,以形象生动的方式描述DLX流水线的工作过程。
模拟器还提供了对流水线操作的统计功能,便于对流水线进行性能分析。
2、流水线执行过程:
指令执行的5个阶段
(1)取指令周期
(2)指令译码/读寄存器周期
(3)执行/有效地址计算周期
(4)存储器访问/分支完成周期
(5)写回周期
3、流水线中的相关:
(1)结构相关:
当某一条机器指令需要访问物理器件时,如加法器,此时加法器正被另一条机器指令使用,从而产生结构相关;
图1
(2)数据相关:
当某一条指令需要访问某个寄存器时,此时这个寄存器正被另一条指令所使用,从而产生数据相关;
图2
(3)控制相关:
当程序执行到某个分支语句时,顺序执行的下一条语句将被跳过而去执行分支语句中满足条件的那条指令,从而产生控制相关。
图3
三、实验目的:
1、通过该模拟实验,进一步掌握和巩固流水线的基本知识;
2、初步掌握在特定体系结构下的汇编代码的编写和优化;
3、培养运用所学知识解决实际问题的能力
4、对流水线性能分析
5、了解影响流水线效率的因素
6、了解各类相关及解决方法
四、实验内容:
使用WinDLX模拟器,对zui4.s做如下分析:
(1).分析zui3.s或zui4.s扩展减少控制相关.s分别和imput.s输入顺序不同时产生的影响。
(2).zui3.s,zui4.s中汇编语言含义,同时分析程序执行流程。
(3).观察程序中出现的数据/控制/结构相关。
指出程序中出现上述现象的指令组合。
(4).考察增加浮点运算部件对性能的影响。
(5).考察增加forward部件对性能的影响。
(6).观察转移指令在转移成功和转移不成功时候的流水线开销。
注意:
除
(2)以外,浮点加、乘、除部件都只有一个;
本问题中所有浮点延迟部件设置为:
加法:
2个延迟周期;乘法:
5个延迟周期;除法19个延迟周期。
五、实验器材(设备、元器件):
IBMPC兼容机
Windows3.0以上的操作系统
六、实验步骤及操作:
1、双击WinDLX图标运行WinDLX。
装入测试程序之前,先初始化WinDLX模拟器:
点击File菜单中的Resetall菜单项,弹出一个“ResetDLX”对话框。
然后点击窗口中的“确认”按钮即可。
2、选择File/LoadCodeorData,按如下步骤操作,可将fact.s和input.s这两个程序装入主存:
点击zui3.s
点击select按钮
点击input.s
点击select按钮
点击load按钮
3、按F7键程序顺序执行观察6个子窗口的情况。
七、实验数据及结果分析:
1、先装入zui3.s再转入input.s时,因为程序顺序执行,地址顺序符合程序执行顺序,程序能够正确执行;顺序相反时,因为input.s的地址高,而程序顺序执行到input.s时将没有正确的输入窗口,程序执行到输出结果时,也不会出现结果
2、程序中出现数据相关因为下面两条指令,第二条指令要读r1而执行到此操作时第一条指令仍对r1进行操作
lwr4,PrintfValue(r3)
swPrintf,r4
图4.数据相关
程序中出现控制相关,当程序执行下面指令时,第二条指令出现跳转指令时,第一条指令还没有执行完,所以出现控制相关
subir2,r2,1
jLoop1
图5.控制相关
程序中出现结构相关,当程序执行下面指令时,第二条指令正在使用除法部件时,第一条指令可能还在使用所以出现结构相关。
divr11,r5,r9
divr12,r10,r9
图6.结构相关
3、.data;定义数据段,默认情况下数据段$DATA会被加载到内存0x1000地址处
Prompt:
.asciiz"Inputanintegerwhichisarray'ssizevalue>1:
";输入语句,指示你输入要输入的数的位数
PromptNumber1:
.asciiz"Inputthenumber1:
";输入数1
PromptNumber2:
.asciiz"Inputthenumber2:
";输入数2
PrintfFormat:
.asciiz"Thefigureis:
%d\n";输出格式,表示求出的同位上相同的数按什么格式输出
.align2;表示下面采用字对齐
PrintPar:
.wordPrintfFormat
Printf:
.space8;给输出值8个字节的存储空间
PrintfValue:
.space1024
.text;第一代码段,默认情况下代码段$CODE会加载到内存0x100地址处
.globalmain;定义一个全局符号main,即该代码段的首地址
main:
;***ReadvaluefromstdinintoR1;将输入的数存入寄存器r1
addir1,r0,Prompt;将位数从标准输入输到寄存器r1中
jalInputUnsigned;跳转到InputUnsigned子程序处读取输入的参数,同时将一条指令的地址存与r31中,即r31<-pc+4
addr2,r0,r1;将r1中的数值放到r2寄存器中,对输入进行数据控制
addr8,r0,r1;将r1中的数值放到r8寄存器中,对输入进行数据控制
addir1,r0,PromptNumber1;将数1从标准输入输到寄存器r1中
jalInputUnsigned
addr5,r0,r1
addir1,r0,PromptNumber2;将数2从标准输入输到寄存器r1中
jalInputUnsigned
addr10,r0,r1
addr3,r0,0
addr6,r0,0;r3,r6置0
addir7,r0,10;r7置10
addir9,r0,1
addir13,r0,1;r9,r13置1
Loop1:
movi2fpf2,r2
movi2fpf10,r13
gtdf2,f10;f2>1?
bfpfInputArray1;若不大于1,跳到InputArray1,此时r9为10的n次方
multr9,r7,r9
subir2,r2,1
jLoop1;Loop1用来求出10的n次方(n为输入的位数),n随后面的循环逐渐减1
InputArray1:
divr11,r5,r9
divr12,r10,r9;
multr15,r11,r9
subr5,r5,r15
multr16,r12,r9
subr10,r10,r16
jInputArray2;跳转InputArray2;InputArray1第一次循环用于求输入的两个数的首位,并保存在r11,r12中.然后将输入的数去掉首位后保存在r5,r10中;第二次循环求出第二位,去掉前两位保存;以此类推
InputArray2:
seqr19,r11,r12
beqzr19,Loop2;比较r11,r12中的数的大小,不等则跳转Loop2
seqr19,r11,r12
bnezr19,Change;比较r11,r12中的数的大小,相等则跳转change
Change:
addir3,r3,4将r3中的数值+4,表示将地址后移4字节(输入的数值为整型,占4个字节)
swPrintfValue(r3),r11;将r11寄存器中的数放入地址为PrintfValue(0x1060)的存储器中
jLoop2;跳转Loop2;Change用于存储同位上相同的数
Loop2:
subir8,r8,1;r8中的数减1,即位数减1
beqzr8,Output;r8为0时,跳转Output
addr2,r8,r0;将r8中的数值放到r2寄存器中
addir9,r0,1;r9置1;
jLoop1;跳转Loop1
Output:
;输出结果
lwr4,PrintfValue(r3)
swPrintf,r4;将寄存器r4中的内容存Printf地址单元中
addir14,r0,PrintPar;将要输出的数据格式输到寄存器r14中
trap5;标准输出
subir3,r3,4将r3中的数值减4,表示将地址后移4字节(输入的数值为整型,占4个字节)
beqzr3,Overr3为0时,Over
jOutput;Output用于倒序输出PrintfValue(0x1060)的存储器中的数,即同位上位数相同的数
Over:
trap0
4、输入数据为5,12345,14365,输出结果为531
图7
输入数据,4,1234,2345,输出结果为0
图8
5、因为程序的运行过程中,设置三个浮点乘法器不能进行并行运算,所以3个floating对程序运行频率没什么提高,但是通过优化程序运行顺序,可以减少相关,提高流水线利用率。
6、提高程序执行效率
7、尽量减少和消除程序中出现的相关
修改之前:
图9.修改之前
观察程序的流水过程,对流水中出现的相关指令进行增删或者移位,使得相关能够减少或者消除,从而提高流水线的效率。
详细如下:
(1)zui3.s文件中
初始代码:
Loop1:
movi2fpf2,r2
movi2fpf10,r13
gtdf2,f10
bfpfInputArray1
multr9,r7,r9
subir2,r2,1
jLoop1
多复制几次可以减少一些相关。
修改后的代码:
Loop1:
movi2fpf2,r2
movi2fpf10,r13
gtdf2,f10
bfpfInputArray1
multr9,r7,r9
subir2,r2,1
movi2fpf2,r2
movi2fpf10,r13
gtdf2,f10
bfpfInputArray1
multr9,r7,r9
subir2,r2,1
movi2fpf2,r2
movi2fpf10,r13
gtdf2,f10
bfpfInputArray1
multr9,r7,r9
subir2,r2,1
jLoop1
修改之后:
图10.修改之后
(2)我还尝试了将其他指令的位置进行调动,或者是增删一些指令,使得程序中的相关尽量少,但是使得程序进入死循环或者是得到错误结果,所以仅做以上一些修改,稍微程序优化了。
修改如图11:
图11.修改方式1
修改之后如图12:
图12.修改之后
修改如图13
图13.修改方式2
修改之后:
图14.修改之后
8、程序流程图:
图15.程序流程图
八、实验结论:
程序的装入要严格按照顺序,顺序将影响程序的正确执行;
程序执行顺序,部件的个数都会对程序的执行产生影响;
为减少数据相关,应调整程序的执行顺序;
为减少控制相关,程序的跳转必须要在合适的位置;
为减少结构相关,器件的个数应该合理分配;
九、总结及心得体会:
通过该模拟实验,进一步掌握和巩固流水线的基本知识;
熟悉了程序的运行环境,了解了软件如何使用;
增强了运用所学知识解决实际问题的能力;
了解了指令执行程序时的逻辑严密性,也了解了寄存器的使用和区别,知道了如何使用正确的指令集,以及每个指令的功能;
对windlx伪汇编语言有了了解、掌握与熟练运用。
对三个相关的了解更加深刻,正确的调用代码的影响,相互间制约。
报告评分:
指导教师签字: