本文共 8456 字,大约阅读时间需要 28 分钟。
基于WindLX的计算机系统结构实验,随机输入n个数,求数i的概率
源码:
随机输入n个数,求数i的概率
1、加深对流水线理论知识的理解;
2、掌握对流水线性能分析的方法,了解影响流水线效率的因素; 3、熟悉在WinDLX体系结构下的汇编代码编写和优化; 4、了解相关的类型及各类相关的解决办法; 5、培养运用所学知识解决实际问题的能力。1、根据WinDLX模拟器伪汇编指令规则编写:随机输入n个数后,求数i的概率的程序gailv.s以及input.s
2、分别按照不同顺序将gailv.s和input.s装入主存,分析输入顺序不同对运行结果产生的影响; 3、观察程序中出现的数据、控制、结构相关,指出程序中出现上述现象的指令组合,并提出解决相关的办法; 4、分别考察各类解决的相关办法,分析解决相关后性能的变化。 注意: 除解决结构相关,其他情况下加、乘、除运算器都只有一个。 本问题中所有浮点延迟部件设置为:加法:2个延迟周期;乘法:5个延迟周期;除法:19个延迟周期。设备:笔记本电脑一台
软件:VMware Workstation 虚拟机:Windows7 32位操作系统 WinDLX模拟器1、初始化WinDLX模拟器
(1)为WinDLX创建目录,C:\WinDLX。将WinDLX和gailv.s、gailv2.s、input.s放在这个目录中。 (2)初始化WinDLX模拟器:点击File 菜单中的 Reset all 菜单项,弹出一个“Reset DLX”对话框,点击窗口中的“确认”按钮即可。如图1所示。图1 初始化模拟器界面
2、将程序装入WinDLX平台
点击File 菜单中的 Load Code or Data 菜单项,依次双击gailv.s和input.s。点击load,将两个程序装入。如图2所示。图2 程序装入界面
3、运行程序并观察
进行单步调试,在WinDLX模拟器的6个子窗口观察程序的执行情况。观察程序运行的总时钟周期,产生的相关种类以及每种相关的数量。
4、解决数据相关
勾选Enable Forwading,采用重定向技术添加专用数据通路减少数据相关,观察数据相关的数量变化。
5、解决结构相关
将Addition Units的数目由1到2,观察结构相关的数量变化。
6、解决控制相关
将gaillv.s的循环体展开形成新文件gailv2.s,采用循环展开的方法减少控制相关,观察控制相关的数量变化。
1、程序装入顺序对运行结果的影响
先装入gailv.s再装入input.s时,程序能够正确执行;当先装入input.s再装入gailv.s时,因为input.s的地址高,而程序顺序执行到input.s时无法正确地输出,因此不会出现结果。2、主要代码及说明
(1)gailv.s主要代码.dataPrompt: .asciiz "input An integer which is array's size value >=0 : "PromptLast: .asciiz "input an integer :"PromptNum: .asciiz "input an integer>=0 which you need:"PrintfFormat: .asciiz "Probability: %g "PromptError: .asciiz "Error!Need int>=0!Input:(Go:1,other to End)".align 2PrintfPar: .word PrintfFormatPrintf: .space 8PrintfValue: .space 1024.text.global mainmain: ;*** 输入数组大小和相关初始化 addi r1,r0,Prompt ;将Prompt字符串首地址放入r1寄存器中 jal InputUnsigned ;跳转子函数,输入数组大小n bnez r10,Error ;输入异常处理 beqz r1,InputNum ;如果r1为0,跳转InputNum add r2,r0,r1 ;将数组大小n存于r2 add r6,r0,r1 ;将数组大小n存于r6 addi r3,r0,0 ;初始化r3 addi r7,r0,1 ;r7等于1 movi2fp f1,r7 ;f1等于1 addf f2,f2,f0 ;初始化f2,f3,f4 addf f3,f3,f0 addf f4,f4,f0 movi2fp f5,r1 ;将数组大小n存于f5InputArray: ;*** 输入数组 beqz r2, ProcessPart ;如果r2等于0则跳转ProcessPart addi r1,r0,PromptLast ;输入数字 jal InputUnsigned bnez r10,Error sw PrintfValue(r3),r1 ;将r1寄存器中的数放入r3寄存区中所存数地址的存储器中 addi r3,r3,4 ;r3后移 subi r2,r2,1 ;r2减1 j InputArray ;循环输入ProcessPart: addi r3,r0,0 ;初始化r3InputNum: ;*** 输入求概率的数字 addi r1,r0,PromptNum jal InputUnsigned bnez r10,Error add r2,r0,r1 ;保存i到r2 movi2fp f2,r2 ;保存i到f2Loop: ;*** 循环与计数 beqz r6,Output ;如果r6等于0则结束Loop跳转Output subi r6,r6,1 ;r6减1 lf f3,PrintfValue(r3) ;取出r3地址中的数到f3 addi r3,r3,4 ;r3后移 movfp2i r7,f2 movfp2i r8,f3 seq r12,r7,r8 ;如果r7等于r8,r12为1,否则为0 bnez r12,Sum ;r12为不等于0,则跳转到Sum计数,否则继续循环 j Loop ;循环Sum: addf f4,f4,f1 ;计数 j LoopOutput: cvti2d f0,f4 ;单精度转换为双精度 cvti2d f6,f5 movfp2i r5,f5 beqz r5,OutputInner ;分母为0 divd f6,f0,f6 ;f6=f0/f6OutputInner: sd Printf,f6 addi r14,r0,PrintfPar trap 5 ;标准输出 trap 0 ;程序结束Error: addi r1,r0,PromptError jal InputUnsigned bnez r1,main trap 0
(2)input.s主要代码
Loop: ;*** reads digits to end of line lbu r3,0(r2) seqi r5,r3,10 ;LF -> Exit bnez r5,Finish slti r11,r3,58;***判断是否为非法字符 beqz r11,Error slti r10,r3,48 bnez r10,Error subi r3,r3,48 ;转换ASCAII码 multu r1,r1,r4 ;转换十进制 add r1,r1,r3 addi r2,r2,1 ;指针后移 j Loop
3、程序分析及运行结果
(1)根据提示输入一个正整数n代表接下来输入的数的总个数。
测试用例:n=5。(2)再根据提示输入n个数字。
测试用例:1,2,3,3,4(3)输入想要求概率的数i。
测试用例:3图3 运行结果截图
由图3可知运行结果为0.4,计算结果正确。
(4)异常处理:输入任何不是自然数的字符,如:负数,小数,以及其他非法字符均会提示错误。异常处理结果如图4所示。
图4 异常处理结果截图
(5)点击Statistics窗口,查看程序执行的时钟周期以及数据相关、结构相关、控制相关的发生次数。
程序执行共用621个时钟周期,数据相关发生172次,结构相关发生2次,控制相关发生42次,如图5所示。图5 时钟周期和相关数据截图
4、数据相关及解决
(1)数据相关产生的原因
movfp2i r8,f3seq r12,r7,r8 ;如果r7等于r8,r12为1,否则为0 bnez r12,Sum ;r12为不等于0,则跳转到Sum计数,否则继续循环
seq指令要使用r8寄存器的数据,但是上一条指令movfp2i刚刚执行完数据还没有更新,产生数据相关,并且之后的bnez指令也需要上一条seq指令的中还没更新的寄存器r12,产生数据相关,如图6所示。
图6 数据相关截图
(2)数据相关的解决
采用重定向技术,勾选Configuration的Enable Forwading选项。在第一条指令结束后直接将寄存器r8的内容更新,在第二条指令结束后直接将寄存器r12数据更新,以此来消除数据相关,如图7所示。
图7 解决数据相关截图
查看运行结果,数据相关数量降低了64,处理后的数据相关个数为108,如图8所示。
图8 解决数据相关的数据截图
5、控制相关及解决
(1)控制相关的产生原因
Loop: ;*** 循环与计数 beqz r6,Output ;如果r6等于0则结束Loop跳转Output subi r6,r6,1 ;r6减1 lf f3,PrintfValue(r3) ;取出r3地址中的数到f3 addi r3,r3,4 ;r3后移 movfp2i r7,f2 movfp2i r8,f3 seq r12,r7,r8 ;如果r7等于r8,r12为1,否则为0 bnez r12,Sum ;r12为不等于0,则跳转到Sum计数,否则继续循环 j Loop ;循环
在这段程序中,循环体的出现造成了控制相关。
(2)控制相关的解决
采用循环展开的方式将循环体的内容复制一次。可以降低控制相关的个数。如下:
Loop: ;*** 循环与计数 beqz r6,Output ;如果r6等于0则结束Loop跳转Output subi r6,r6,1 ;r6减1 lf f3,PrintfValue(r3) ;取出r3地址中的数到f3 addi r3,r3,4 ;r3后移 movfp2i r7,f2 movfp2i r8,f3 seq r12,r7,r8 ;如果r7等于r8,r12为1,否则为0 bnez r12,Sum ;r12为不等于0,则跳转到Sum计数,否则继续循环 beqz r6,Output ;如果r6等于0则结束Loop跳转Output subi r6,r6,1 ;r6减1 lf f3,PrintfValue(r3) ;取出r3地址中的数到f3 addi r3,r3,4 ;r3后移 movfp2i r7,f2 movfp2i r8,f3 seq r12,r7,r8 ;如果r7等于r8,r12为1,否则为0 bnez r12,Sum ;r12为不等于0,则跳转到Sum计数,否则继续循环 j Loop ;循环
重新运行后控制相关数量减少为40,如图9所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6sjzazP-1594038417510)(https://cdn.jsdelivr.net/gh/Justlovesmile/CDN2/post/20200614120000.png)]
图9 解决控制相关的数据截图
6、结构相关及解决
(1)结构相关产生的原因
addf f2,f2,f0 ;初始化f2,f3,f4addf f3,f3,f0addf f4,f4,f0
在这段语句运行时需要连续进行加操作,由于加法器只有一个,产生结构相关。
(2)结构相关的解决
添加加法器Addition Units的个数,如图10所示。
图10 增加加法器Addition Units界面的截图
再次运行程序可以发现结构相关数量降低,降低到0个,如图11所示。
图11 解决结构相关的数据截图
7、程序流程图
如图12所示。
图12 程序流程图
转载地址:http://ibgwi.baihongyu.com/