体系结构windlx流水线实验报告

  • 格式:doc
  • 大小:1.57 MB
  • 文档页数:9

下载文档原格式

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

实验一基本实验 ----by 王琳 PB07210432

1. 实验目的:

1)熟悉计算机流水线基本概念

2)了解DLX基本流水线的各段的功能

3)了解各种不同指令在流水线中的实际流动情况

4)对流水线做性能分析

5)了解影响流水线效率的因素——数据相关、结构相关、控制相关,了解相关的种类

6)了解解决数据相关的方法

2. 实验平台:WinDLX仿真器

WinDLX简介:

是一个图形化、交互式的DLX流水线仿真器。

可以装入DLX汇编语言程序,然后单步,设断点或是连续执行该程序.

CPU的寄存器,流水线,I/O和存储器都可以用图形表示出来

提供了对流水线操作的统计功能.

可以装载文件名为*.s的文件.

要求的硬件平台是IBM-PC兼容机.

WinDLX是一个Windows应用程序,运行以上和以上的操作系统.

WinDLX软件包中带有说明文件及教程,可以供使用者进一步了解仿真器的使用方法和DLX处理器的原理.大家再进行实验前应该仔细阅读这些文档.

3. 实验内容:

1)在仿真器上分别运行单条指令:Load指令、Store指令、分支指令、寄存器ALU指令、立即数ALU指令,记录它们在流水线中的执行情况

Lw:

观察此流水线时空图,可以发现:转移指令引起的延迟仅为1 clocks,另2 stalls 是trap指令引起的,这个执行结果似与不采用forwarding技术的前提相违,只能理解为对于无条件的转移指令,新的PC值在EX阶段即已被写入。

Sw:

Beqz:

由此图可见,对于分支指令,总是用

not-taken的策略来处理,并且也认为新

的PC值也在EX阶段即已被写入,且cond

条件也在EX段被算出(这显然是一个极不合理的假设,究竟为何分支指令的延迟为1 stall有待进一步探究)

寄存器ALU指令

立即数ALU指令

2)仿真器运行一段无相关的程序,记录它的执行情况,计算流水线的加速比、吞吐率与效率。下面是一段不相关的程序,一共6条指令

ADDI R5, R5, 1

SUBI R4, R4, 1

AND R3, R3, R3

XOR R7, R7, R7

ADDI R8, R8, 1

ADDI R9, 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/5

3)在仿真器运行一段程序:

在用仿真器模拟前先自己手动分析出程序执行时的

相关种类与个数:

1.addi-addi关于r2的raw相关:2 stalls

2.lw-addi关于r1的raw相关:2 stalls

3.addi-sw关于r1的raw相关:2 stalls

4.addi-sub关于r2的raw相关:2 stalls

5.sub-bnez关于r4的raw相关:2 stalls

6.bnez的控制相关(always not-take):

1 stalls(not hit)/0 stall(hit)

7.j的控制相关:1 stalls

8.trap:2 stalls

在DLX上的实际运行结果:

统计该程序在流水线中出现的各种相关个数,及其

引起的流水线暂停周期数:

可见,此执行结果与之前手动分析的结果完全相同

4)通过在流水线中设置定向路径来消除数据相关后,仅lw-addi一处会产生关于r1的raw相关,延迟为1 stall,转移指令的延迟情况不变:

一个循环的执行时间:6+1+1=8(clocks)

总执行时间:(2)+(8*2-1)+(1+1)+(1+2)=22(clocks)

总RAW相关的stall数:1*2=2(clocks)

运行程序:

有出入的原因是windlx认为

除了在lw-addi处有1 stall

的raw相关,sub-bnez处也

会有1 stall的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默认采取了always not-taken的分支预测策略,且不支持延迟槽的概念,所以唯一可做的调度就是通过分离lw-addi和sub-bnez指令来消除raw相关,调度后的程序如下图所示:

一个循环的执行时间:6+1=7(clocks)

总执行时间:2+(7*2-1)+(1+1)+(1+2)=20

(clocks)

总RAW相关的stall数:0(clocks)

运行程序:

统计在流水线中出现的相关个数,及其引起的流水线暂停周期数