北邮高级计算机系统结构实验二三四五
- 格式:doc
- 大小:960.51 KB
- 文档页数:27
北京邮电大学实验报告课程名称计算机系统结构计算机学院03班王陈(11)目录实验一WINDLX模拟器安装及使用......................................... 错误!未定义书签。
·实验准备................................................................................ 错误!未定义书签。
·实验环境................................................................................ 错误!未定义书签。
·实验步骤................................................................................ 错误!未定义书签。
·实验内容及要求.................................................................... 错误!未定义书签。
·实验过程............................................................................. 错误!未定义书签。
·实验总结............................................................................. 错误!未定义书签。
实验二指令流水线相关性分析 ............................................... 错误!未定义书签。
·实验目的............................................................................. 错误!未定义书签。
实验报告(5)姓名:学号:班级:日期:一、实验目的:掌握二叉树结构的有关运算,熟悉二叉树的存储结构和基本应用。
二、实验原理:完成树结构的运算。
具体:写一个对一棵二叉树中所有结点的左、右子树相互交换的算法程序。
三、实验内容及要求:编写一个算法程序实现:1、建立一棵6个结点的二叉树,结点的数据值是正整数,并按中序输出之;2、完成对以上二叉树中所有结点的左、右子树相互交换,并按中序输出交换以后的结果。
3、统计二叉树叶子结点的个数,并输出结果。
要求:请同学把步骤、调试好的程序及存在的问题写在下面。
步骤:首先建立一棵二叉树,同时创建6个结点。
其次编写一个函数,采用递归中序输出结点的数据,其次交换二叉树的左右子树,也是采用递归,并中序输出交换后的结果。
最后,遍历整个二叉树,统计并输出叶子结点的个数。
代码:#include <stdlib.h>#include <stdio.h>int i=0;typedef int DataType;typedef struct Node{DataType data;struct Node *leftchild;struct Node *rightchild;}BiTreeNode; //结点的结构void Initiate(BiTreeNode **root);//初始化创建二叉树的根结点BiTreeNode* InsertLeftNode(BiTreeNode* curr,DataType x);//创建根结点的左子树BiTreeNode* InsertRightNode(BiTreeNode* curr,DataType x);//创建根结点的右子树void Visit(DataType x);//访问结点void InOrder(BiTreeNode* root);//树的中序遍历void Destory(BiTreeNode** root);//释放树所占的空间void Exchange(BiTreeNode* root);//对二叉树所有结点的左、右子树进行交换int Travel(BiTreeNode* root);//遍历树,计算叶子结点的个数int main(){BiTreeNode *root,*p1,*p2,*p3;int n;Initiate(&root);//初始化创建二叉树的根结点root->data=5;p1=InsertLeftNode(root,3);p2=InsertLeftNode(p1,2);p3=InsertRightNode(p1,6);p1=InsertRightNode(root,7);p2=InsertRightNode(p1,1);printf("中序输出的序列为:");InOrder(root);//树的中序遍历printf("\n");Exchange(root);//对二叉树所有结点的左、右子树进行交换printf("交换左右子树后的中序输出的序列为:");InOrder(root);printf("\n");n=Travel(root);//遍历树,计算叶子结点的个数printf("二叉树中叶子结点的个数有:%d个\n",n);Destory(&root);system("pause");return 0;}void Initiate(BiTreeNode **root)//初始化创建二叉树的根结点{*root = (BiTreeNode *)malloc(sizeof(BiTreeNode));(*root)->leftchild = NULL;(*root)->rightchild = NULL;}BiTreeNode* InsertLeftNode(BiTreeNode* curr,DataType x)//创建根结点的左子树{BiTreeNode *s,*t;if(curr==NULL) return NULL;t=curr->leftchild;s=(BiTreeNode *)malloc(sizeof(BiTreeNode));s->data=x;s->leftchild=t;s->rightchild=NULL;curr->leftchild=s;return s;}BiTreeNode* InsertRightNode(BiTreeNode* curr,DataType x)//创建根结点的右子树{BiTreeNode *s,*t;if(curr==NULL) return NULL;t=curr->rightchild;s=(BiTreeNode *)malloc(sizeof(BiTreeNode));s->data=x;s->rightchild=t;s->leftchild=NULL;curr->rightchild=s;return s;}void Visit(DataType x)//访问结点{printf(" %d",x);}void InOrder(BiTreeNode* root)//树的中序遍历{if(root==NULL) return;InOrder(root->leftchild);Visit(root->data);InOrder(root->rightchild);}void Destory(BiTreeNode** root)//释放树所占的空间{if((*root)!=NULL&&(*root)->leftchild!=NULL){Destory(&(*root)->leftchild);}if((*root)!=NULL&&(*root)->rightchild!=NULL){Destory(&(*root)->rightchild);}free(*root);}void Exchange(BiTreeNode* root)//对二叉树所有结点的左、右子树进行交换{BiTreeNode *s,*t;if(root==NULL)return;s=root->leftchild;t=root->rightchild;root->leftchild=t;root->rightchild=s;Exchange(root->leftchild);Exchange(root->rightchild);}int Travel(BiTreeNode* root)//遍历树,计算叶子结点的个数{if(root==NULL)return 0;if(root->leftchild==NULL&&root->rightchild==NULL)i++;Travel(root->leftchild);Travel(root->rightchild);return i;}存在的问题:二叉树的建立遍历与查找都需要使用递归,迭代算法难度较大,因而本程序的时间复杂度大,其次,6个结点的值在创建二叉树时便已经固定下来,结点的值不能由用户自行输入,这是本程序的一个缺陷。
2009级数据结构实验报告实验名称:实验四——排序学生姓名:班级:班内序号:学号:日期:2010/12/171.实验要求实验目的:通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。
实验内容:使用简单数组实现下面各种排序算法,并进行比较。
排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序7、归并排序8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。
2. 程序分析2.1 存储结构使用最简单的一维数组存储待排序的数据。
共使用两个数组,一个用来存储原始数据,一个用来存储待排序数据。
每次排序完毕,用原始数据更新一次待排序数据,保证每一次都对同一组数据排序。
(图略)2.2 关键算法分析1.直接插入的改进:在一般的直接插入中,关键码每移动一次就需要比较一次。
在移动的方面,优化是比较困难的,因为对静态线性表的插入必然要带来大量的移动。
但是,我们可以在比较上进行一些优化。
在查找技术一张曾学过的“折半查找法”,在这里就可以照葫芦画瓢地运用。
一趟排序的伪代码如下:1.如果该元素大于处于其左侧相邻的元素则跳过该元素;2.low=0,high=i;3.循环直至low==high3.1 mid=(low+high)/2;3.2如果当前元素大于中值high=mid;3.3否则low=mid+1;4.当前元素赋值给临时变量;5.将有序区中处于low位置及其右侧的元素右移;6.临时变量置于low位置简单说一下这里的折半查找与一般查找算法的区别。
这里的查找,尤其是对无重复数据和大量数据的处理中,更多的时候是找不到完全相等的项的。
一、实验目的1. 了解计算机组成原理的基本概念和组成结构。
2. 掌握计算机各部件的功能和相互关系。
3. 通过实验,加深对计算机组成原理的理解和认识。
4. 培养动手能力和实际操作技能。
二、实验内容本次实验主要分为以下几个部分:1. 计算机组成原理实验台介绍2. 数据通路和控制器实验3. 存储器实验4. 输入/输出实验5. 系统总线实验三、实验步骤1. 计算机组成原理实验台介绍实验开始前,先对实验台进行简要介绍,包括实验台的功能、操作方法、注意事项等。
2. 数据通路和控制器实验(1)观察数据通路和控制器结构,了解其组成和功能。
(2)通过实验,验证数据通路和控制器的基本工作原理。
(3)掌握数据通路和控制器的设计方法。
3. 存储器实验(1)观察存储器结构,了解其组成和功能。
(2)通过实验,验证存储器的基本工作原理。
(3)掌握存储器的设计方法。
4. 输入/输出实验(1)观察输入/输出设备,了解其组成和功能。
(2)通过实验,验证输入/输出设备的基本工作原理。
(3)掌握输入/输出设备的设计方法。
5. 系统总线实验(1)观察系统总线结构,了解其组成和功能。
(2)通过实验,验证系统总线的基本工作原理。
(3)掌握系统总线的设计方法。
四、实验结果与分析1. 数据通路和控制器实验通过实验,我们成功验证了数据通路和控制器的基本工作原理。
在实验过程中,我们了解到数据通路由数据总线、控制总线、地址总线等组成,控制器负责协调各部件的工作。
2. 存储器实验通过实验,我们成功验证了存储器的基本工作原理。
在实验过程中,我们了解到存储器由存储单元、地址译码器、读写控制电路等组成,存储单元负责存储数据。
3. 输入/输出实验通过实验,我们成功验证了输入/输出设备的基本工作原理。
在实验过程中,我们了解到输入/输出设备通过接口电路与主机相连,实现数据的输入和输出。
4. 系统总线实验通过实验,我们成功验证了系统总线的基本工作原理。
在实验过程中,我们了解到系统总线由数据总线、地址总线、控制总线等组成,负责传输数据和控制信号。
高级计算机系统结构实验报告实验二指令流水线相关性分析实验三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软件优化编译:通过指令重新排序消除结构相关。
北京邮电大学实验报告课程名称计算机系统结构计算机学院 201班王陈(2016110711)目录实验一 WINDLX模拟器安装及使用 (2)·实验准备............................................................................. 错误!未定义书签。
·实验环境............................................................................. 错误!未定义书签。
·实验步骤............................................................................. 错误!未定义书签。
·实验内容及要求................................................................. 错误!未定义书签。
·实验过程............................................................................. 错误!未定义书签。
.实验总结 (6)实验二指令流水线相关性分析 (6).实验目的 (7).实验环境 (7).实验步骤 (7)·实验过程............................................................................. 错误!未定义书签。
.实验总结 (12)实验三DLX处理器程序设计 (13).实验目的 (13)·实验环境............................................................................. 错误!未定义书签。
北邮计算机组成实验报告北邮计算机组成实验报告一、实验概述计算机组成实验是计算机科学与技术专业的一门重要实践课程,旨在通过实际操作和实验验证,加深学生对计算机硬件组成的理解和掌握。
本次实验的主要内容是通过搭建一个简单的计算机系统,包括CPU、存储器和输入输出设备等,来实现一个简单的指令执行过程。
二、实验目的1. 理解计算机系统的基本组成部分,包括CPU、存储器和输入输出设备等。
2. 掌握计算机指令的执行过程,包括指令的获取、解码和执行等。
3. 熟悉计算机系统的工作原理,包括时钟信号、总线传输和寄存器的使用等。
三、实验过程1. CPU设计与搭建在本次实验中,我们选择了基于MIPS架构的CPU进行设计和搭建。
首先,我们需要设计并实现CPU的指令集,包括算术运算、逻辑运算和数据传输等。
然后,根据指令集的要求,设计并实现CPU的控制逻辑电路,包括指令获取、解码和执行等。
最后,通过连接寄存器、ALU和存储器等组件,完成CPU的搭建。
2. 存储器设计与实现在计算机系统中,存储器是用于存储指令和数据的重要组成部分。
在本次实验中,我们选择了SRAM作为存储器的实现方式。
首先,我们需要根据CPU的指令集和数据需求,确定存储器的容量和位宽等参数。
然后,设计并实现存储器的读写控制电路,以实现指令和数据的读写功能。
最后,通过连接存储器和CPU,完成存储器的搭建。
3. 输入输出设备设计与实现在计算机系统中,输入输出设备用于与外部环境进行数据交互。
在本次实验中,我们选择了键盘和显示器作为输入输出设备的实现方式。
首先,我们需要设计并实现键盘的输入控制电路,以实现对输入数据的获取和传输。
然后,设计并实现显示器的输出控制电路,以实现对输出数据的显示和传输。
最后,通过连接输入输出设备和CPU,完成输入输出设备的搭建。
四、实验结果与分析通过实验,我们成功搭建了一个简单的计算机系统,并进行了指令执行的测试。
在测试过程中,我们编写了一些简单的程序,包括加法、乘法和逻辑运算等。
北邮大三计算机体系结构实验三DLX处理器程序设计DLX处理器是一种精简指令集计算机体系结构,它包含了32个通用寄存器,支持32位指令和数据,以及高度定制化的流水线架构,能够提供高效的指令执行能力。
本文将针对DLX处理器进行程序设计,主要实现一个简单的计算程序。
首先,我们将使用汇编语言来设计DLX处理器的程序。
DLX处理器的指令集采用32位指令,并且按照固定格式进行编码。
在本实验中,我们将实现一个简单的加法程序。
首先,我们需要定义一些常量和变量。
在DLX处理器中,可以使用32个通用寄存器来存储数据和中间结果。
我们可以使用其中的3个寄存器来存储输入数据和输出结果。
```assembly.datainput1: .word 5input2: .word 7result: .word 0```接下来,我们需要编写程序的主体部分。
程序的主体部分包含了一系列的指令,用来执行具体的计算任务。
在本实验中,我们将使用ADD指令来执行加法操作,并将结果存储到result寄存器中。
```assembly.textmain:L.D F0, input1L.D F2, input2ADD.DF4,F0,F2S.D result, F4```在这段代码中,我们首先使用L.D指令将input1中的值加载到浮点寄存器F0中,然后使用L.D指令将input2中的值加载到浮点寄存器F2中。
接着,我们使用ADD.D指令将F0和F2中的值相加,并将结果存储到F4中。
最后,我们使用S.D指令将F4中的值存储到result寄存器中。
最后,我们需要在程序中添加一些必要的指令,用来启动和结束程序的执行。
在DLX处理器中,程序的执行是按照顺序进行的,因此我们只需要添加一些简单的指令即可。
```assemblystart:j mainnop```总结起来,本文针对北邮大三计算机体系结构实验三DLX处理器程序设计,我们使用汇编语言设计了一个简单的加法程序。
数据结构实验报告实验名称:实验四排序——题目一学生姓名:班级:班内序号:学号:日期:2012年12月15日1.实验要求使用简单数组实现下面各种排序算法,并进行比较。
排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序(选作)7、归并排序(选作)8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。
2. 程序分析首先,题目要求测试不同的数据,所以可以手动输入待排序元素。
其次,由于对一组数据要求用不同的排序算法来处理,所以需要一个复制函数把排序前的无序数组寄存出去,为下一次排序做准备。
再次,由于每次排序后都需要把排序后的结果打印出来,代码是一样的,根据相同的代码可以封装成一个函数的思想,所以还需增加一个打印函数。
最后,由于题目中要求计算代码的执行时间精确到微妙级,而c++库函数中的clock()函数等只能精确到毫秒级,故需调用微软公司在其多媒体Windows中提供了精确定时器的底层API支持,本实验中调用queryperformancefrequency 和queryperformancecounter函数即可满足精确到微妙级的要求。
2.1 存储结构本程序采用简单数组来储存输入的待排序数组。
2.2关键算法分析2.2.1 插入排序算法插入排序的思想是:每次从无序区取一元素将其添加到有序区中。
C++描述如下,其中形参r[]为待排序数组,n为待排序元素个数2.2.2 希尔排序算法希尔排序是一种缩小增量排序的算法,首先将待排序元素集按照一定间隔分成多个子集,分别对这些子集进行直接插入排序,整个序列部分有序。
北京邮电大学计算机学院计算机系统结构实验指导书王春露邝坚编著2007.3 – 2013.4目录z计算机系统结构实验简介z DLX处理器简介1. 实验一WINDLX模拟器安装及使用2. 实验二指令流水线相关性分析3. 实验三DLX处理器程序设计4. 实验四代码优化5. 实验五循环展开(选作)计算机系统结构实验简介DLX是一个虚拟处理器。
该处理器是加州大学伯克利分校计算机系JohnL .H ennessy教授和斯坦福大学计算机系David A. Patterson教授在其《计算机体系结构:一种定量的方法》一书中提出的。
该处理器反映了新一代处理器的特点。
通过了解DLX处理器的结构和工作原理,并利用DLX模拟器进行实验,可以帮助学生综合地了解和运用有关处理器指令系统的设计、流水线的设计与实现等方面的知识,有助于计算机系统结构课程内容的理解。
DLX处理器简介第一节 DLX基本结构DLX是一种典型的Load/Store型指令集结构。
它不仅体现了当今多种机器的指令集结构的共同特点,而且它还体现出未来一些机器的指令集结构的特点。
这些机器的指令集结构设计思想都和DLX指令集结构的设计思想十分相似,它们都强调:(1) 具有一套简单的Load/Store指令集;(2) 注重指令流水效率;(3) 简化指令的译码;(4) 高效支持编译器。
DLX是一种易于学习和研究的处理器结构模型。
这种类型的机器正在日趋流行,而且其结构非常易于理解。
1.DLX中的寄存器DLX中有32个通用寄存器(GPRs),分别将其命名为R0,R1…R31。
每个通用寄存器长度为32位。
另外,DLX中有32个浮点寄存器(FPRs),分别将其命名为F0,F1…F31。
每个浮点寄存器长度为32位。
这些浮点寄存器可以用来保存32位的单精度浮点数,或者通过相邻两个浮点寄存器奇偶对FiFi+1(i=0,2,4…,30)来保存双精度浮点数,这种组合而成的64位双精度浮点寄存器在DLX中分别被命名为F0,F2…F28,F30.2. DLX数据类型DLX提供了多种长度的整型数据和浮点数据。
北邮数据结构实验报告图一、实验报告规范实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:1.需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
2.概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。
4.调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;(3)经验和体会等。
5.用户使用说明说明如何使用你编写的程序,详细列出每一步的操作步骤。
6.测试结果列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.附录带注释的源程序。
如果提交源程序软盘,可以只列出程序文件名的清单。
值得注意的是,实习报告的各种文档资料,如:上述中的前三部分要在程序开发的过程中逐渐充实形成,而不是最后补写(当然也可以应该最后用实验报告纸誊清或打印)。
数据结构实验报告;实验名称:实验一线性表实现一个多项式;学生姓名:黄锦雨;班级:XX211109;班内序号:20;学号:XX210263;日期:XX年10月31日;实验目的:;1.熟悉C++语言的基本编程方法,掌握集成编译环;2.学习指针、模板类、异常处理的使用;3.掌握线性表的操作的实现方法;4.学习使用线性表解决实际问题的能力;实验内容:;数据结构实验报告实验名称:实验一线性表实现一个多项式学生姓名:黄锦雨班级:XX211109班内序号: 20学号: XX210263日期: XX年10月31日实验目的:1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2.学习指针、模板类、异常处理的使用3.掌握线性表的操作的实现方法4.学习使用线性表解决实际问题的能力实验内容:利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3 + … + anxn要求:1. 能够实现一元多项式的输入和输出2. 能够进行一元多项式相加3. 能够进行一元多项式相减4. 能够计算一元多项式在x处的值5. 能够计算一元多项式的导数(选作)6. 能够进行一元多项式相乘(选作)7. 编写测试main()函数测试线性表的正确性2. 程序分析由于多项式是线性结构,故选择线性表来实现,在这个程序中我采用的是单链表结构,每个结点代表一个项,多项式的每一项可以用其系数和指数唯一的表示。
北邮世纪学院数据结构实验文档实验一:线性表的实现<上机实验要求>修订历史记录本文档简要说明了第一次上机实验的作业要求。
目录修订历史记录 (1)1实验目的 (3)2问题描述 (3)2.1基本要求 (3)2.2高级要求 (3)3实验要求 (3)4上机实验文档要求 (3)5编程提示 (3)1实验目的(1)熟悉Visual C++6.0的编程环境,学会编译、设置断点、调试程序;(2)学习使用MSDN帮助(3)了解线性表的不同存储结构,并掌握顺序表和链表的编程方法(4)了解软件测试的工作内容和方法。
(5)熟悉软件文档的写作(6)了解团队开发,增强合作精神。
2问题描述有n个同学一起玩游戏(10≤n≤99),大家围成一圈,依靠学号来区分同学,从某一个同学(编号为a)开始数数,遇到7的倍数或者包含7的数(比如17,27),则该同学退出圈外,请求解同学们退出的顺序(用学号表示)。
2.1基本要求(1)同学的总人数n可变(10≤n≤99),开始位置a可变(1≤a≤n);(2)用两种线性表的存储结构来分别表示围成圈的同学和退出顺序。
比如,可以用循环链表或者双链表表示围成的圈,用顺序表(一位数组)来存储退出的同学学号的顺序;(3)同学的学号可以用简单1,2,3,…,M编号;(4)文档中,对算法的时间复杂度和空间复杂度进行分析,判断复杂度与n之间的关系。
(5)算法的流程图使用Visio绘制。
2.2高级要求(1)通过读取txt文件来读取学生的学号和姓名,最后的输出结果采用名单的方式显示到屏幕上;(2)用结构体存储学生的信息;(3)可以将“过七”改成“过x”,x为2~9的任意整数。
(4)程序有差错控制,能够对错误的输入参数进行提示和识别,比如总人数为负数。
3实验要求三人一组,文档完备,不得抄袭;成绩计算方法:编码50% 测试20% 文档30%4上机实验文档要求参考“实验报告模板.doc”,包含问题描述、算法思路、算法描述、源程序清单、测试结果(典型测试实例)、心得体会、分工及签名要求上交打印版,包含签名。
计算机系统结构的发展历程课程:高级计算机系统结构姓名:学号:班级:2015年12月一、计算机系统结构随着当今社会和科技的飞速发展,自四十年代计算机问世以来,计算机科学更是发展迅速,应用领域不断扩展计算机的普及和广泛应用,现代社会正朝着高度信息化,自动化方向发展。
计算机逐渐成为社会必不可少的支柱力量。
计算机系统是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。
计算机是脑力的延伸和扩充,是近代科学的重大成就之一。
计算机系统由硬件系统和软件系统组成。
前者是借助电、磁、光、机械等原理构成的各种物理部件的有机组合,是系统赖以工作的实体。
后者是各种程序和文件,用于指挥全系统按指定的要求进行工作。
而计算机系统结构是计算机的的机器语言程序员或编译程序编写者所看到的外特性。
所谓外特性,就是计算机的概念性结构和功能特性,主要研究计算机系统的基本工作原理,以及在硬件、软件界面划分的权衡策略,建立完整的、系统的计算机软硬件整体概念。
其也称为计算机体系结构,它是由计算机结构外特性,内特性,微外特性组成的。
经典的计算机系统结构的定义是指计算机系统多级层次结构中机器语言机器级的结构,它是软件和硬件/固件的主要交界面,是由机器语言程序、汇编语言源程序和高级语言源程序翻译生成的机器语言目标程序能在机器上正确运行所应具有的界面结构和功能。
以最常见的冯诺依曼计算机为例,计算机系统结构包含了以下几个方面:1.指令集架构(Instruction set architecture;简称ISA):被视为一种机器语言,包含了许多相关的指令集(存储器定址、处理器控制,寄存器控制等等……)。
2.微体系结构/微架构(Microarchitecture)或称计算机组织(Computerorganization):是更详细的叙述系统内部各元素如何进行合作与沟通。
3.数据表示,即硬件能直接识别和处理的数据类型和数据格式。
4.寻址方式,包括最小寻址单位和地址运算等。
实验二指令流水线相关性分析·实验目的通过使用WINDLX模拟器,对程序中的三种相关现象进行观察,并对使用专用通路,增加运算部件等技术对性能的影响进行考察,加深对流水线和RISC 处理器的特点的理解。
·实验原理:指令流水线中主要有结构相关、数据相关、控制相关。
相关影响流水线性能。
·实验步骤一.使用WinDLX模拟器,对Fact.s做如下分析:(1)观察程序中出现的数据/控制/结构相关。
指出程序中出现上述现象的指令组合。
(2)考察增加浮点运算部件对性能的影响。
(3)考察增加forward部件对性能的影响。
(4)观察转移指令在转移成功和转移不成功时候的流水线开销。
·实验过程一.使用WinDLX模拟器,对Fact.s做如下分析:浮点加、乘、除部件都设置为1,浮点数运算部件的延时都设置为4,如图1:图1 初始设置将fact.s和input.s加载至WinDLX中,如图2示。
图2 加载程序1.观察程序中出现的数据/控制/结构相关;指出程序中出现上述现象的指令组合。
1)数据相关点击F7,使程序单步执行,当出现R-Stall时停止,运行过程中出现下图3所示,输入整数6。
图3 输入整数6打开Clock Diagram,可以清楚的看到指令执行的流水线如图4所示。
图4 指令流水线双击第一次出现R-Stall的指令行,如图5所示。
图5 指令详细信息对以上出现的情况分析如下:程序发生了数据相关,R-Stall(R-暂停)表示引起暂停的原因是RAW。
lbu r3,0×0(r2)要在WB周期写回r3中的数据;而下一条指令seqi r5,r3,0×a要在intEX周期中读取r3中的数据。
上述过程发生了WR冲突,即写读相关。
为了避免此类冲突,seq r5,r4,0×a的intEX指令延迟了一个周期进行。
由此,相关指令为:2)控制相关由图6可以看出,在第4时钟周期:第一条指令处于MEM段,第二条命令处于intEX段,第三条指令出于aborted状态,第四条命令处于IF段。
图 6 指令流水线以上情况原因分析:在窗口中,模拟处于第四时钟周期,第3条命令指示为:“aborted”。
原因是:第二条命令jal InputUnsigned是无条件分支指令,在第4个时钟周期,jal指令执行intEX周期之后才知道转移的位置,下一条指令应该执行sw SaveR2(r0),r2指令。
但之前jal InputUnsigned的下一条命令movi2fp f10.r1已经取出,所以需要将该指令流水清空,即movi2fp的执行应被取消,在流水线中留下气泡。
3)结构相关首先,我们先来看一下执行过控制相关的时空图和Pipeline,如下图7所示。
图7 控制相关图8 控制相关的Pipeline当我们点击Pipeline中IF所对应的框框可以看到详细的该指令执行情况,如下图9所示。
图9 指令详情图9表明了addi r2,r2,0×1的详细信息。
该指令与它前一条指令add r1,r1,r3发生了结构相关。
并且由于此处的冲突,需要暂停2个周期。
在ID段暂停后,则开始进图intEX段。
所以这条指令(addi r2,r2,0×1)你不能进入ID流水段,译码部分占用,发生了结构相关。
该部分的指令为:1.考察增加浮点运算部件对性能的影响。
该实验取N=6首先通过Configuration,点击Floating Point Stage Configuration来设置浮点运算部件的配置。
实验要求所有浮点运算部件的延时都请设定为4个周期,所以我们将Delay这一栏改成4,而Count可以任意,为了对比,我们第一次浮点运算部件取全部为1,第二次浮点运算部件取全部为2。
如下图所示:运行50个cycles之后,可以看到他们数据的对比:由此可见,浮点运算部件的增减对效率无影响。
比较各个数据,发现没有变化。
无论怎么增加浮点运算部件,统计结果都一样。
原因在于此程序中浮点计算指令没有重叠,所以并行度没有增加,性能没有提高。
3.考察增加forward部件对性能的影响。
为了对比有无forward部件的性能。
需要在Configuration中勾选enable forwarding,以及不勾选enable configuration来看性能数据的对比,不使用forward部件和使用forward部件:从上面的数据我们可以看出增加forward部件后RAW由原来占总时钟周期的26%减少至18%,RAW个数由原来的13减少至9。
增加forward部件使得控制相关比例增加了。
即,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。
4.观察转移指令在转移成功和转移不成功时候的流水线开销。
我们假设,浮点部件设置Count=1,Delay=4;N=6。
执行50个cycles完毕后,查看条件转移分支,如下图所示:由上图可知,转移指令一共2条,成功转移1条(占50%),不成功为1条。
所以,静态指令调度算法只能解决数据相关,条件转移结果与原来相比没有变化。
即,若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低;若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,执行效率会下降。
·实验总结通过本次试验,不仅更加熟悉了WinDLX模拟器的使用以及对其基础功能的认识,而且通过单步执行程序,观察三种相关的出现,以及思考出现的原因,是我更加深入了解了流水线。
实验三 DLX处理器程序设计·实验目的:学习使用DLX汇编语言编程,进一步分析相关现象·实验原理:掌握向量运算算法和编程方法。
·实验内容和要求:自编一段汇编代码,完成两双精度浮点一维向量的加法(或乘除法)运算,并输出结果。
向量长度>=16。
观察程序中出现的数据/控制/结构相关·实验步骤:一.熟悉DLX汇编语言。
(1)汇编器处理汇编文件时,数据位于内存中data指针所指向的空间,指令位于text指针所指向的空间。
(2)Trap 0是通知WINDLX模拟器程序结束,Trap 5是输出格式化到标准输出二.编写两双精度浮点一维向量的加法运算程序。
代码清单如下:.dataV1: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16V2: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16a: .asciiz "result = "c: .asciiz "%f ".align 2d: .word cdizhi: .space 8.text.global mainmain:addi r1,r0,asw dizhi,r1 ;存储字,保存a的首地址addi r14,r0,dizhitrap 5 ;输出字符串"result = "addi r10,r0,0 ;r10 = 0addi r8,r0,20 ;r8 = 20,即向量的长度loop:ld f2,V1(r10)ld f4,V2(r10)addd f2,f2,f4 ;将V1,V2的相应项依次相加,保存在f2sd dizhi,f2 ;存储双精度浮点数f2addi r14,r0,dtrap 5 ;输出结果addi r10,r10,8 ;取V1,V2下一项subi r8,r8,1 ;循环次数减一bnez r8,loop ;假如r8!=0,则返回到looptrap 0 ;结束运行完毕之后出现:运行结果如下:1.观察程序中出现的数据/控制/结构相关本次实验执行过程共出现RAW数据相关80次,控制相关15次,trap54次,共有stall 149次。
具体如下:1)数据相关2)T-stall3)控制相关2.考察增加浮点运算部件对性能的影响。
比较浮点运算部件分别为1和2时,接下来查看Statistis进行比较,如下图由以上两图可得,本实验增加浮点运算部件对流水线性能没有影响。
3.增加FORWARD部件对性能的影响。
为了对比有无forward部件的性能。
需要在Configuration中勾选enable forwarding,以及不勾选enable configuration来看性能数据的对比,不使用forward部件和使用forward部件:从上面的数据我们可以看出增加forwardi部件后,时钟周期由368减少至301个,RAW由原来占总时钟周期的39.94%减少至26.58%;RAW个数由原来的147减少至80;增加forward部件使得控制相关比例增加了,但是数目并没有增加。
总而言之,使用forward部件后,总的时钟周期减少,数据相关减少,流水线的性能得到一定的改善。
4.观察转移指令在转移成功和转移不成功时候的流水线开销。
由上图可得,转移指令一共16条,其中成功转移15条,占93.75%,不成功转移1条,占5%。
静态指令调度算法是在出现数据相关时,为了消除或者减少流水线空转,编译器确定并分离出程序中存在在相关的指令,然后进行指令调度,并对代码优化。
但是静态指令调度只能解决数据相关,条件转移结果与原理来相比没有变化。
若转移不成功,对流水线的执行无影响,流水线的吞吐率和效率没有降低。
若转移成功,则要废弃预先读入的指令,重新从转移成功处读入指令,每执行一条条件转移指令,一条x段流水线就有x-2个流水线被浪费掉,执行效率降低,性能有一定的损失。
·实验总结加深了对汇编语言的理解与运用,尤其是trap 5,输出格式化到标准输出的理解,在代码中,应注意:相加的结果要保存到dizhi这个变量中,否则即使运算正确也不能把结果输出。
实验四代码优化·实验目的:学习简单编译优化方法,观察采用编译优化方法所带来的性能的提高。
·实验原理:采用静态调度方法重排指令序列,减少相关,优化程序。
·实验步骤:1.优化实验3程序代码清单及注释说明.dataV1: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16V2: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16a: .asciiz "result = "c: .asciiz "%f ".align 2d: .word cdizhi: .space 8.text.global mainmain:addi r1,r0,a ;该指令与sw dizhi,r1存在RAW相关,故将addir8,r0,16和addi r8,r0,16加到中间addi r10,r0,0 ;该指令与ld f2,V1(r10) 存在RAW相关,故将其提前addi r8,r0,16sw dizhi,r1addi r14,r0,dizhitrap 5loop:ld f2,V1(r10)ld f4,V2(r10)addi r10,r10,8subi r8,r8,1addd f2,f2,f4 ;该指令与前面两条指令均存在RAW相关,将其延后执行addi r14,r0,dsd dizhi,f2 ;该指令与addd f2,f2,f4存在RAW相关,将其延后执行trap 5bnez r8,looptrap 0执行完毕后,我们点击Statistics查看运行结果数据分析2.程序相关性分析结果左图是优化前的,右图是优化后的由上述两图对比可以看出,数据相关:其RAW相关由优化前的26.58%减少为12.65%,性能改善很多;控制相关:由原来的4.17%变为5.38%,数量没变,没有改善。