您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 体系结构windlx流水线实验报告
实验一基本实验----by王琳PB072104321.实验目的:1)熟悉计算机流水线基本概念2)了解DLX基本流水线的各段的功能3)了解各种不同指令在流水线中的实际流动情况4)对流水线做性能分析5)了解影响流水线效率的因素——数据相关、结构相关、控制相关,了解相关的种类6)了解解决数据相关的方法2.实验平台:WinDLX仿真器WinDLX简介:是一个图形化、交互式的DLX流水线仿真器。可以装入DLX汇编语言程序,然后单步,设断点或是连续执行该程序.CPU的寄存器,流水线,I/O和存储器都可以用图形表示出来提供了对流水线操作的统计功能.可以装载文件名为*.s的文件.要求的硬件平台是IBM-PC兼容机.WinDLX是一个Windows应用程序,运行DOS3.3以上和Windows3.0以上的操作系统.WinDLX软件包中带有说明文件及教程,可以供使用者进一步了解仿真器的使用方法和DLX处理器的原理.大家再进行实验前应该仔细阅读这些文档.3.实验内容:1)在仿真器上分别运行单条指令:Load指令、Store指令、分支指令、寄存器ALU指令、立即数ALU指令,记录它们在流水线中的执行情况Lw:观察此流水线时空图,可以发现:转移指令引起的延迟仅为1clocks,另2stalls是trap指令引起的,这个执行结果似与不采用forwarding技术的前提相违,只能理解为对于无条件的转移指令,新的PC值在EX阶段即已被写入。Sw:Beqz:由此图可见,对于分支指令,总是用not-taken的策略来处理,并且也认为新的PC值也在EX阶段即已被写入,且cond条件也在EX段被算出(这显然是一个极不合理的假设,究竟为何分支指令的延迟为1stall有待进一步探究)寄存器ALU指令立即数ALU指令2)仿真器运行一段无相关的程序,记录它的执行情况,计算流水线的加速比、吞吐率与效率。下面是一段不相关的程序,一共6条指令ADDIR5,R5,1SUBIR4,R4,1ANDR3,R3,R3XORR7,R7,R7ADDIR8,R8,1ADDIR9,R9,1在WinDLX中执行的结果如下:如上图所示:6条指令一共执行了10个周期,而每个指令都需要5个周期来完成。故可得加速比:5*6/10=3实际吞吐率:流水线由5段组成,完成6条指令,m=5,n=6,T=5△t+(6-1)△t=10△t,Tp=n/T=3/(5△t),即为实际吞吐率。效率:E=1/(1+(m-1)/n)=TP*△t=3/53)在仿真器运行一段程序:在用仿真器模拟前先自己手动分析出程序执行时的相关种类与个数:1.addi-addi关于r2的raw相关:2stalls2.lw-addi关于r1的raw相关:2stalls3.addi-sw关于r1的raw相关:2stalls4.addi-sub关于r2的raw相关:2stalls5.sub-bnez关于r4的raw相关:2stalls6.bnez的控制相关(alwaysnot-take):1stalls(nothit)/0stall(hit)7.j的控制相关:1stalls8.trap:2stalls在DLX上的实际运行结果:统计该程序在流水线中出现的各种相关个数,及其引起的流水线暂停周期数:可见,此执行结果与之前手动分析的结果完全相同4)通过在流水线中设置定向路径来消除数据相关后,仅lw-addi一处会产生关于r1的raw相关,延迟为1stall,转移指令的延迟情况不变:一个循环的执行时间:6+1+1=8(clocks)总执行时间:(2)+(8*2-1)+(1+1)+(1+2)=22(clocks)总RAW相关的stall数:1*2=2(clocks)运行程序:有出入的原因是windlx认为除了在lw-addi处有1stall的raw相关,sub-bnez处也会有1stall的raw相关(真搞不懂,难道分支指令在IF阶段开始读取寄存器的值了!?),按照这种想法重新计算的结果是:一个循环的执行时间:6+1*2+1=9(clocks)总执行时间:2+(9*2-1)+(1+1)+(1+2)=24(clocks)总RAW相关的stall数:2*2=4(clocks)统计在流水线中出现的相关个数,及其引起的流水线暂停周期数:5)通过对程序进行编译优化并结合其他相关解决方法——分支预测与延迟槽:由于windlx默认采取了alwaysnot-taken的分支预测策略,且不支持延迟槽的概念,所以唯一可做的调度就是通过分离lw-addi和sub-bnez指令来消除raw相关,调度后的程序如下图所示:一个循环的执行时间:6+1=7(clocks)总执行时间:2+(7*2-1)+(1+1)+(1+2)=20(clocks)总RAW相关的stall数:0(clocks)运行程序:统计在流水线中出现的相关个数,及其引起的流水线暂停周期数4.实验步骤:1)运行WinDLX仿真器.2)根据实验内容的要求设计出相应的DLX程序.3)完成所有的实验内容.5.实验时间:4课时6.实验要求:1)必做实验。2)自己设计出体现实验要求的程序。比如在进行统计相关种类与个数的步骤中所用到的程序怎么尽可能包含所有种类的相关,建议3)要求学生实际在仿真器运行程序并统计结果,课后形成图表上交实验报告。4)通过实验分析相关对流水线的性能影响,实际掌握各种相关解决策略,比较采用各种策略前后流水线的性能,形成图表上交实验报告。7.参考材料:计算机体系结构教材、WinDLX仿真器使用指南8.附录编写代码的要求:1)需要编写代码文件*.s。所有程序均用DLX汇编语言编写.2)文件格式请参照WinDLX自带的例子程序.常见问题:1.Load指令后都是nop?注意选择了文件后要Select,或双击,下方SelectFiles显示了相应的文件名才是已经选择了文件。选择之后需再Load.正确的Load会显示:File(s)LoadedSuccessfully,ResetDLX?此时在Window-Code窗口里应该能看到你的代码。2.Load时会出现“CodeorDataError”?这是因为你的汇编代码有错。DLX汇编的格式请参考帮助文件之TheDLX-AssemblyLanguage&&DLXInstructionsSet&&DLX-Examples。如果是Load自带的GCM和FACT的例子,请先务必LoadInput.s。(WinDLX可以一次load多个.s文件).3.如何初始化内存呢?Memory-Change里面可以察看/设置内存的值,指定Address和Value后Set即可。Memory-Display可以显示内存的值。4.程序运行时会报错“MemError”可能是因为你程序中用到的访存地址没有对齐导致,Memory是按字对齐的,访问地址必须是4的倍数。也可能是地址超过了存储器得地址范围。默认的存储器大小是0x8000Bytes,可以通过Configuration-MemorySize来设置大小。.5.如何载入立即值?可以通过LHI指令和其他指令的组合,或者用ADDI指令来实现。注意LW是访存指令,并非载入立即值指令。具体指令请参考DLXInstructionSet。6.指令用到了立即数需不需要用“#“用不用不会影响,具体请参考TheDLX-AssemblyLanguage&&DLX-Examples.7.例子里的.data,.global等是干什么用的?这些是编译制导语句,具体含义请参考TheDLX-AssemblyLanguage-Directives..spacesizeMovethecurrentstoragepointerforwardsizebytes(toleavesomeemptyspaceinmemory).data[address]Causethefollowingcodeanddatatobestoredinthedataarea.Ifanaddresswassupplied,thedatawillbeloadedstartingatthataddress,otherwise,thelastvalueforthedatapointerwillbeused.Ifwewerejustreadingdatabasedonthetext(code)pointer,storethataddresssothatwecancontinuefromtherelater(ona.textdirective)..text[address]Causethefollowingcodeanddatatobestoredinthetext(code)area.Ifanaddresswassupplied,thedatawillbeloadedstartingatthataddress,otherwise,thelastvalueforthetextpointerwillbeused.Ifwewerejustreadingdatabasedonthedatapointer,storethataddresssothatwecancontinuefromtherelater(ona.datadirective)..globallabelMakethelabelavailableforreferencebycodefoundinfilesloadedafterthisfile.8.WinDLX能指定定向路径吗?如何指定?WinDLX可以启用和禁止Forwarding。Configuration-EnableForwarding.定向路径可以显示出来,选中ClockCycleDiag-DisplayForwading9.如何设置程序代码和数据段在内存中起始位置?有没有类似i386汇编的ORG语句?WinDLX没有ORG指令,但可以通过Symbol来指定代码和数据段的起始位置。在程序中用.text.data分别指示代码段和数据段,然后在WinDLX里通过设置Symbol的地址来改变代码段和数据段在内存中的位置。Memory-Symbol,选中相应的Symbol后输入数值,然后Change即可,但变化在下一次载入指令时才起作用。10.WinDLX的图形和数据没办法存下来,实验报告的图表得自己画吗?图形可以采用PrintScreen的方式存下来然后Paste到报告中来,数据最好是自己记下来,并整理。
本文标题:体系结构windlx流水线实验报告
链接地址:https://www.777doc.com/doc-5664478 .html