计算机系统结构实验一流水线指令调度
- 格式:doc
- 大小:188.50 KB
- 文档页数:11
实验一流水线中的相关一、实验目的1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点;2. 加深对计算机流水线基本概念的理解;3. 进一步了解DLX基本流水线各段的功能以及基本操作;4. 加深对数据相关、结构相关的理解,了解这两类相关对CPU性能的影响;5. 了解解决数据相关的方法,掌握如何使用定向技术来减少数据相关带来的暂停二、实验平台WinDLX 模拟器三、实验内容和步骤1.用WinDLX模拟器执行下列三个程序:(分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
熟练掌握WinDLX的操作和使用。
)●求阶乘程序fact.s⏹步进的运行方式:步进的运行方式是指,每次控制只执行一条语句,快捷键为F7键:图1-1 单步运行测试⏹设置断点的运行方式:鼠标点击某行,按下“Insert键”,设置断点:图1-2 设置断点图1-3 断点设置成功,按F5运行至断点⏹连续的运行方式:通过按下F5键,可直接运行至断点处;按下F8键,并在对话框内键入跳跃的步数,可以直接跳转指定的步数:图1-4 设置跳转步数●求最大公倍数程序gcm.s,观察程序在流水线中的执行情况:●求素数程序prim.s,观察CPU 中寄存器和存储器的内容2. 用WinDLX运行程序structure_d.s通过模拟找出存在资源相关的指令对以及导致资源相关的部件;记录由资源相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期数的百分比;论述资源相关对CPU性能的影响,讨论解决资源相关的方法。
●存在资源相关的指令、导致资源相关的部件⏹两条指令同时访问寄存器f4,造成资源相关:⏹两条指令同时访问ALU,造成资源相关:●由资源相关引起的暂停时钟周期数、暂停时钟周期数占总执行周期数的百分比由资源相关引起的暂停时钟周期数:30;总执行周期数:139;暂停时钟周期数占总执行周期数的百分比:21.6%3. 在采用、以及不采用定向技术的情况下,分别用WinDLX 运行程序data_d.s(记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比;并计算采用定向技术后性能提高的倍数)●采用定向技术:(左下图)⏹计算暂停时钟周期数占总执行周期数的百分比:30/128=23.4%图3-1 采用定向技术图3-2 不采用定向技术●不采用定向技术:(右上图)⏹计算暂停时钟周期数占总执行周期数的百分比:104/202=51.5%●采用定向技术后性能提高的倍数:202/128=1.58倍四、实验总结●资源相关对CPU性能的影响、讨论解决资源相关的方法资源相关使相关指令在流水线上停滞,降低了执行效率;为解决这一问题,应在编写代码时尽量避免总是使用同一寄存器;并通过指令调度,使相关的代码执行距离拉开。
高级计算机系统结构实验报告实验二指令流水线相关性分析实验三DLX处理器程序设计实验四代码优化实验五循环展开专业计算机科学与技术班级2015姓名学号2015实验二指令流水线相关性分析1. 实验目的:通过使用WINDLX模拟器,对程序中的三种相关现象进行观察,并对使用专用通路,增加运算部件等技术对性能的影响进行考察,加深对流水线和RISC处理器的特点的理解。
2. 实验设备环境:2.1 WinDLX模拟器可以装入DLX汇编语言程序,然后单步、设置断点或者连续执行该程序;2.2 CPU的寄存器、流水线、I/O和存储器都可以使用图形的方式表示出来;2.3 模拟器还提供了对流水线操作的统计功能;2.4 该模拟器对理解流水线和RISC处理器的特点很有帮助;2.5 所有浮点运算部件的延时都设定为4个周期;3. 实验原理:指令流水线中主要有结构相关、数据相关、控制相关。
相关影响流水线性能。
3.1数据相关定义:原有先后顺序的两条指令(I1,I2)在对共享变量(位置)进行读、写时,指令流水线中实际完成的读、写顺序与原有顺序不一致,导致流水线输出错误。
三类数据相关:写读(WR)相关读写(RW)相关写写(WW)相关解决方法技术:1.使某些流水线指令延迟、停顿一或多个周期。
2.双端口存储器:如果指令和数据放在同一个存储器。
3.设置两个存储器:一个数据存储,一个为指令存储器。
4.软件优化编译:通过指令重新排序,消除数据相关。
5.定向技术:又称旁路技术或专用通路技术,是使后续指令提前得到前指令的运算结果(适合ALU类指令)3.2结构相关定义:如果某指令在流水线重叠执行过程中,硬件资源满足不了指令重叠执行的要求,会产生资源冲突或竞争,称为流水线结构相关解决方法技术:1.延迟技术:使某些指令延迟、停顿一或多个时钟周期2.双端口存储器:允许同时读两个数据或指令3.设置双存储器(哈弗结构):一个数据存储,一个指令存储。
4软件优化编译:通过指令重新排序消除结构相关。
计算机体系结构实训课程学习总结指令级并行与流水线设计在计算机科学与技术领域中,计算机体系结构是一门关于计算机硬件与软件的核心学科。
在我修习的计算机体系结构实训课程中,我学习了指令级并行与流水线设计,掌握了该领域的核心概念与技术,下面是我对该课程的学习总结和心得体会。
一、指令级并行概述指令级并行是指在一个周期内同时执行多条指令,以减少指令的执行时间,提高计算机的性能。
在学习指令级并行的过程中,我了解了计算机指令的基本原理及其执行过程。
通过学习指令流水线、数据前推、乱序执行等技术,我深入理解了指令级并行的优势和实现方法。
在实训过程中,我通过搭建指令级并行的实验平台,进行了仿真实验和性能分析。
通过比较顺序执行和指令级并行执行的效果,我发现指令级并行可以大幅度提高计算机的执行效率。
而在实现指令级并行时,我也面临了一些挑战,如数据相关、控制相关等问题,但通过优化代码和调整指令执行顺序,我成功地解决了这些问题。
这个过程让我深刻体会到指令级并行设计的重要性和技术难点。
二、流水线设计与优化流水线设计是指将计算机指令的执行过程划分为多个阶段,并使不同阶段的指令并行执行,从而提高计算机的吞吐量。
在学习流水线设计的过程中,我深入了解了流水线的原理、特点和结构。
通过学习流水线的组织方式、数据冒险、控制冒险等问题,我掌握了流水线设计的关键技术。
在实验中,我设计了一个基于流水线的简单计算机,并通过编写适当的指令集和流水线寄存器,实现了流水线的功能。
通过性能测试,我发现流水线设计可以显著提高计算机的执行效率和吞吐量。
然而,我也发现了一些流水线设计中的问题,比如分支预测错误、资源冲突等,这些问题对流水线的性能产生了负面影响。
通过调整分支预测策略和添加冲突检测机制,我成功地进行了优化,提高了流水线设计的性能。
三、实训过程中的收获与反思通过学习指令级并行与流水线设计,我不仅极大地提高了对计算机体系结构的理解和掌握,还培养了解决实际问题的能力。
计算机体系结构与指令流水线计算机体系结构是指计算机硬件和软件之间的交互方式,它决定了计算机的组织结构、数据传输方式以及指令的执行过程。
在计算机体系结构中,指令流水线是一种重要的技术手段,它可以提高计算机的性能和效率。
本文将深入探讨计算机体系结构与指令流水线的相关知识。
一、计算机体系结构的基本原理计算机体系结构包括硬件体系结构和软件体系结构。
硬件体系结构代表了计算机硬件的组织和连接方式,它包括中央处理器(CPU)、存储器和输入输出设备等;软件体系结构则是指操作系统和编程语言等软件的组织方式。
在计算机体系结构中,指令的执行是一个重要的过程。
指令由操作码和操作数组成,计算机的执行方式是将指令从存储器中取出,经过解码和执行阶段完成相应的操作。
传统的计算机执行方式是按照指令的顺序一个一个地执行,这样会导致指令之间存在较大的时间间隔,浪费了计算机的效率。
二、指令流水线的原理与优势为了提高计算机的效率,减少指令之间的时间间隔,人们提出了指令流水线的概念。
指令流水线将指令的执行过程划分为多个阶段,每个阶段都由一个专门的电路来完成,不同的指令可以同时在不同的阶段执行,以实现多条指令的并行执行。
指令流水线的优势主要体现在以下几个方面:1. 提高了计算机的吞吐量。
由于指令流水线可以实现多条指令的并行执行,因此可以在同样的时间内完成更多的指令,从而提高了计算机的吞吐量。
2. 减少了指令之间的等待时间。
在指令流水线中,不同指令可以在不同阶段同时执行,减少了指令之间的等待时间,提高了计算机的效率。
3. 加快了指令的执行速度。
通过将指令的执行过程切分为多个阶段,并行执行不同指令的不同阶段,可以加快指令的执行速度,缩短了计算时间。
然而,指令流水线也存在一些限制和问题,例如:1. 指令相关性。
如果后续指令依赖于前面指令的结果,就会导致指令流水线的停顿,降低了计算机的效率。
2. 分支指令。
由于分支指令可能会改变指令的执行顺序,因此对于分支指令,指令流水线需要进行预测和处理,以避免出现时间浪费。
计算机组成与体系结构——流⽔线相关知识点(常考计算) 流⽔线是软考中经常考的⼀部分内容,并且常以要求计算的形式出现,所以,这⾥详细总结⼀下流⽔线的相关知识点。
流⽔线的概念 流⽔线是指在程序执⾏时多条指令重叠进⾏操作的⼀种准并⾏处理实现技术。
即可以同时为多条指令的不同部分进⾏⼯作,以提⾼各部件的利⽤率和指令的平均执⾏速度。
我们都知道,在执⾏⼀条指令的过程中,最少要经历取指分析执⾏三个步骤,也就是说,假设有三个指令1 、2、 3,当我们在正常情况下,在执⾏指令1的时候,会⾸先对指令1按照以上三个步骤进⾏处理,处理完毕后在对指令2进⾏处理,以此类推。
⽽流⽔线的应⽤,就是像我们在⼯⼚中⼀样,当对指令1进⾏分析⼯作时,同时对指令2进⾏取指,继续执⾏,当指令1到达执⾏阶段时,指令2进⼊分析阶段1同时对于指令3进⾏取指处理,这样就⼤⼤增加了对于时间的利⽤率。
流⽔线的计算 1、流⽔线的执⾏时长 ①关于流⽔线的周期,我们需要知道的是,流⽔线周期(△t)为指令执⾏阶段中执⾏时间最长的⼀段。
②流⽔线的计算公式为: 完成⼀条指令所需的时间+(指令条数-1)*流⽔线周期,在这个公式中,⼜存在理论公式和实践公式。
理论公式: 实践公式:(k+n-1)*△t k为⼀条指令所包含的部分的多少 例题:若指令流⽔线⼀条指令分为取指、分析、执⾏三个阶段,并且这三个阶段的时间分别为取指1ns,分析2ns,执⾏1ns,则流⽔线的周期为多少?100条指令全部执⾏完毕需要执⾏的时间是多少? 分析:上⾯已经说过,流⽔线的周期为花费时间最长的阶段所花费的时间,所以流⽔线的周期就是2ns。
根据理论公式,T=(1+2+1)+(100-1)*2=4+99*2=202ns 根据实践公式,T=(3+100-1)*2=204ns 在这⾥,需要注意的是,因为流⽔线的理论公式和实践公式的结果不⼀样,但是在考试过程中可能都会考到,所以,在应⽤时,先考虑理论公式,后考虑实践公式。
中央民族大学实验报告
八、实验数据及结果分析:
一、用指令调度技术解决流水线中的结构相关与数据相关:
1、instruction.s文件的代码:
2、运行程序部分截图
3、未用指令调度技术之前程序执行过程中的相关:
4、运行结果数据统计
5、采用指令调度后的程序代码
6、采用调度技术后发生的关联
7、运行结果数据统计
二、用循环展开、寄存器换名以及指令调度提高性能:
1、test.s文件的源代码如下:
2、运行test.s文件,记录运行过程中存在的相关,以及运行总的时钟周期数
3、将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。
然后对新的循环体进行寄存器换名和指令调度,代码如下:
4、记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数:。
计算机专业类课程实验报告课程名称:计算机系统结构学院:计算机科学与工程专业:计算机科学与技术学生姓名:林怡学号:2012060020023指导教师:叶娅兰日期:2015年 5月 5日电子科技大学计算机学院实验中心电 子 科 技 大 学实 验 报 告实验一一、实验名称:流水线指令调度二、实验学时:4三、实验内容和目的:实验目的:1. 通过本实验,理解指令调度的方法。
2.掌握使用VC 开发平台模拟处理机内部指令流调度的编程策略。
实验内容:(一)给定要执行的任务和执行该任务的流水线结构流水线的调度方式能够提高任务的并行度,但是针对不同的任务,由于相关的存在,其并行度的提高是不一致的。
在开始程序设计前,我们首先要给定所要完成的任务: 这里我们使用最简单的累加操作∑=n1i Ai 。
n 的数值可以变化,通过变换n 的值用同一程序进行多次模拟。
给定流水线: 流水线分四个步骤,每个步骤的执行时间均为一个单位时间。
(二)对任务进行分解任务分解的目的是为了减少相关。
例如n =4时,任务分解为 A1+A2、A3+A4、 A1+A2+A3+A4 三个加法操作。
如果n 的大小是未知的,任务该怎样分解呢?换而言之,在程序模拟中,有没有一种通行的分解处理方式,可以实现对任意数目的源数据的累加的分解?(三)任务分解程序模拟的思路首先,Ai 是对称的,Ai 和Aj 都是一个源操作,任意更换其相对位置,计算的累加和的结果是不变的。
每次的加法操作能执行的必要条件是存在两个源数据,因此我1 2 3 4 X Y们可以把所有的源数据放入一个队列中,只要该队列中有两个源,那么就执行加法,加法计算的结果是下一次计算的源数据,我们把它再放回源数据队列,直到对列中只剩一个数据、同时加法流水线中没有执行加法操作时,整个累加过程完成。
(四)加法流水线的设计加法流水线分为四个步骤,每个步骤时间花费是一个单位时间。
模拟程序的目的是为了计算总的执行时间,因此对于每个步骤执行的功能并不需要关心。
为此设计一个总步数为4步的加法器,接收两个输入数据,经过4个时间片,输出加法的结果。
时间片可以用定时器来模拟。
(五)程序设计程序应包括一个队列,一个加法类,一个定时器,一个输出对话框。
队列用于存放源数据,一开始将n个源数据A1-An放入。
启动定时器,每一个时间片从队列中取出两个源数据,送入加法器(可以通过调用加法器中接口函数,把源数据作为参数传入)。
构造加法器类,可以考虑用一个长度对4的执行队列来模拟4个步骤,每个时间片将队列的数据依次下压一格,队列尾的数据进行加法计算并将结果压入源数据队列。
用一个记数值表示时间开销,每个时间片对该记数值加1。
当源队列只剩一个数据且加法器的执行队列为空时,整个程序结束,记数器的值就是任务执行的总体时间花费。
(五)多次模拟可以通过循环的方式对n从4-20进行循环,将每次模拟运行的时间开销值在对话框中显示出来。
如果可能将结果打印。
四、实验原理:程序设计及数据结构:实验程序共有6个类,分别是:①PipeAdditionTest 公共类,测试程序,每一个n的循环,将计时器清零并初始化长度为n的源操作数队列,当源操作数队列有多余一个操作数或者加法器的执行队列不为空的时候持续调用加法器类执行加法操作,在程序结束时输出n以及计时器timercounter的值;②OperaQueue 操作数队列类,包括一个操作数队列数据结构、队列初始化函数OperaQueue(int queueLength)、从队列中取一个源操作数函数getOperationNum()和将加法器计算的结果压入队尾的函数pushOperationNum(int op);电子科技大学计算机学院实验中心③Addition 加法器类,包含一个加法执行队列additionQueue,一个用于暂存操作数的队列addOperandQueue。
构造函数Addition(int len)用于初始化加法器执行队列,函数fetchOpNum在每一个时间片从源操作数队列中取出操作数,函数getAdditionResult()将两个源操作数相加并返回它们的和,以及一个空操作executeNop()用于模拟加法器四级流水线。
④Timer 成员变量timerCounter为时间片计数器。
⑤DialogFrame 对话框相关。
⑥DialogFrameComponent 对话框相关。
五、实验器材(设备、元器件)Win7操作系统、Eclipse集成开发环境、JDK1.8、Java程序语言六、实验步骤:程序流程图:七、实验数据及结果分析:当n=4时,时空图如下:此时时间片开销为t=9当n=5时,时空图如下:此时时间片开销为t=12t=13电子科技大学计算机学院实验中心实验程序结果如图:由截图可知,实验结果与时空图的结果是一致的,说明实验程序的正确性。
八、实验结论、心得体会和改进建议:1、通过本次实验,我自己动手实现了一个简单的加法流水线,增加了我对于流水线的工作流程的理解,也明白了通过指令的分解可以加快指令的运行速度并减少相关。
2、通过对流水线的模拟,不仅熟悉了流水线指令调度的过程,也训练了我多种数据结构的使用,以及将问题抽象的能力。
在模拟程序的实现中,我采用了队列、类等等基本的结构,这次实验,让我理解了流水线的调度策略,同时实际的程序开发也提高了我的编程能力。
实验代码如下:/*******PipeAdditionTest.java********/package Pipeline;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Font;import java.awt.Graphics;import java.util.LinkedList;import java.util.Queue;import javax.swing.JComponent;import javax.swing.JFrame;public class PipelineAdditionTest{public static String printStr = "";public static void main(String[] args) {int n = 0;String tempStr = "";for (n=4;n<=20;n++){Timer.timerCounter = 0; //计时器初始化为0int op1 = 0,op2 = 0;int sum = 0;OperaQueue operaQueue = new OperaQueue(n); //创建长度为n的操作数队列Addition addition = new Addition(4); //初始化创建一个空的加法器执行队列长度为4/**当源队列里有多于一个数据或者加法器的执行队列不为空时执行加法操作*/while ((operaQueue.opQueue.size() > 1)| !addition.additionQueue.toString().equals("[0, 0, 0, 0]")){/*若指令到达流水线最后一级,则求和并将结果压入源操作数队列*/if(addition.additionQueue.peek() == 1){sum =addition.getAddtionResult(addition.addOperandQueue.poll(),电子科技大学计算机学院实验中心addition.addOperandQueue.poll());operaQueue.pushOperationNum(sum); //加法操作得到的结果压入操作数队列System.out.println("peek后operaQueue.size()="+operaQueue.opQueue.size());}/*若源操作数队列中有多于两个操作数*/if (operaQueue.opQueue.size() > 1){System.out.println("beforeoperaQueue.size()="+operaQueue.opQueue.size());op1 = operaQueue.getOperationNum();op2 = operaQueue.getOperationNum(); //从操作数队列中取两个源操作数addition.addOperandQueue.offer(op1);addition.addOperandQueue.offer(op2); //暂存入加法器的操作数队列,以便后续进行加法操作System.out.println("取数后operaQueue.size()="+operaQueue.opQueue.size());addition.fetchOpNum(); //指令进入加法流水线,压入加法器执行队列}else {addition.executeNop(); // 若源操作数队列中的元素个数少于2个,执行空操作}System.out.println("执行后addQueue="+addition.additionQueue.toString());if (operaQueue.opQueue.size() == 1 &&addition.additionQueue.toString().equals("[0, 0, 0, 0]")){sum = operaQueue.opQueue.poll();break;}Timer.timerCounter++;System.out.println(" t"+Timer.timerCounter+"\n");}tempStr = "n = "+n+" timer = "+Timer.timerCounter+"sum="+sum+"\n";printStr = printStr + tempStr;}/*调用对话框*/EventQueue.invokeLater(new Runnable() {public void run() {JFrame frame = new DialogFrame();frame.setTitle("流水线加法指令调度");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}});}}/*** 操作数队列,长度初始化为n*/class OperaQueue{Queue<Integer> opQueue;public OperaQueue(int queueLength){opQueue = new LinkedList<Integer>(); //初始化队列for (int i=1;i<queueLength+1;i++){opQueue.offer(i); //操作数1~n依次入队}}int getOperationNum(){return opQueue.poll();}void pushOperationNum(int op){opQueue.offer(op); //将相加后的操作数入队}}/*** 加法器类,分为四个步骤*/class Addition{Queue<Integer> additionQueue = new LinkedList<Integer>();Queue<Integer> addOperandQueue = new LinkedList<Integer>();Addition(int len){/*初始化加法器执行队列*/while (len--!=0)additionQueue.offer(0);}void fetchOpNum(){电子科技大学计算机学院实验中心/*执行队列下压一格,模拟4个步骤*//*第一级取数操作*/additionQueue.poll();additionQueue.offer(1);}void executeNop(){/*执行队列下压一格,模拟4个步骤*//*空操作*/additionQueue.poll();additionQueue.offer(0);}int getAddtionResult(int opa,int opb){/*将两个源操作数相加,返回它们的和*/return opa+opb;}}/*** 计时器timerCounter*/class Timer{public static int timerCounter; //计时器timercounter}/*** 对话框*/class DialogFrame extends JFrame{public DialogFrame(){add(new DialogFrameComponent());pack();}}class DialogFrameComponent extends JComponent{public static int MESSAGE_X = 40;public static int MESSAGE_Y = -200;private static final int DEFAULT_WIDTH = 400;private static final int DEFAULT_HEIGHT = 350;public void paintComponent(Graphics g){String[] str = PipelineAdditionTest.printStr.split("\n");for (int i = 0;i < str.length;i++){g.setFont(new Font("Tahoma", Font.BOLD, 12));g.drawString(str[i], MESSAGE_X, MESSAGE_Y);MESSAGE_Y += 15;}}public Dimension getPreferredSize(){return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);}}电子科技大学计算机学院实验中心。