实验四控制冒险与分支预测
- 格式:doc
- 大小:429.50 KB
- 文档页数:20
分支程序的设计实验报告实验目的本实验旨在通过设计一个分支程序来展示控制流程中的分支结构,加深对这一概念的理解,并通过实际编程提高对分支结构的应用能力。
实验原理分支程序是一种常见的控制流程结构,它根据条件的真假选择不同的执行路径。
在编程中,分支程序通常用于判断特定条件是否满足,并根据不同结果执行不同的操作。
常见的条件语句包括if 语句、switch 语句等。
在设计一个分支程序时,需要明确条件和执行路径,并根据不同情况进行相应处理。
分支程序的设计需要考虑条件的正确性和完备性,避免出现判断错误或遗漏情况。
实验过程本实验选择使用Python 语言来设计和实现一个简单的分支程序。
具体步骤如下:1. 首先,根据实际需求确定分支程序的目标和条件。
在本实验中,我们设计了一个分支程序来判断一个数字是否是奇数。
2. 接下来,根据选定条件,实现相应的判断逻辑。
我们使用if 语句来对给定数字进行判断。
如果数字对2 求余等于0,那么这个数字是偶数;否则,这个数字是奇数。
3. 在程序中加入输出语句,以便用户能够看到最终的判断结果。
4. 编译和运行程序,观察输出结果是否符合预期。
在实验过程中,我们还可以进行额外的调试和优化,并添加更多的分支条件来扩展程序功能。
例如,我们可以增加一个分支条件来判断数字是否为负数,或者根据数字的大小进行不同的处理等。
实验结果经过编写、编译和运行,我们得到了一个简单的分支程序。
该程序可以根据给定的数字判断其是否是奇数,并将结果输出给用户。
下面是程序的源代码:pythonn = int(input("请输入一个整数: "))if n % 2 == 0:print("这是一个偶数。
")else:print("这是一个奇数。
")以下是程序运行的示例结果:请输入一个整数: 5这是一个奇数。
请输入一个整数: 8这是一个偶数。
实验总结通过本次实验,我们深入学习了分支程序的设计原理和实现方法,并通过编写一个简单的示例程序加深了对分支结构的理解。
一、实验目的1. 理解并掌握分支结构在程序设计中的作用。
2. 熟练运用if-else语句和switch-case结构实现分支控制。
3. 通过实际案例,提高对分支结构在实际编程中的应用能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 2019三、实验内容1. 实验一:使用if-else语句判断一个数是正数、负数还是零。
```c#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (num > 0) {printf("%d 是正数。
\n", num);} else if (num < 0) {printf("%d 是负数。
\n", num);} else {printf("%d 是零。
\n", num);}return 0;}```2. 实验二:使用switch-case结构判断一个星期中的某一天。
```c#include <stdio.h>int main() {int day;printf("请输入星期几(1-7):");scanf("%d", &day);switch (day) {case 1:printf("星期一。
\n");break;case 2:printf("星期二。
\n");break;case 3:printf("星期三。
\n");break;case 4:printf("星期四。
\n");break;case 5:printf("星期五。
实验四 分支程序与循环程序一、实验目的1、熟悉转移指令的功能与使用;2、掌握偏移量的计算方法;3、熟悉分支程序设计和调试方法;4、进一步掌握堆栈指令的使用;5、熟悉循环程序设计和调试方法。
二、实验仪器1、DVCC-598JH 单片开发机一台;2、WD-5型直流稳压源一台。
三、实验预习1、认真阅读实验指导书有关内容,明确实验目的、内容和操作步骤;2、对实验中的程序和指令进行手工汇编;3、复习实验中相关指令的功能;4、复习偏移量的计算及OFST 键的操作方法。
四、实验内容 1、分支程序设计分支程序是根据不同的条件,执行不同的程序段,也称条件分支程序。
程序一:比较片内RAM 40H 和41H 单元中的两个无符号数,将较大数存入40H 单元,较小数存入41H 单元。
)0()0(∠≥⎩⎨⎧+-=a a ba b a y参考程序:ORG1000HSTART : MOV A ,40H CLRCSUBB A ,41HJNCW AITMOV A,40HXCH A,41HMOV 40H,AW AIT:SJMP $END程序二:设a数存放在累加器A中,b数存放在寄存器B中,求下列算式的y值,并将结果存入累加器A中。
参考程序:ORG 1000HJB ACC.7,NUSCLR CSUBB A,BSJMP DONENUS:ADD A,BDONE:SJMP DONEEND2、循环程序设计在实际应用中,往往需要多次反复执行某种相同的操作,而只是参与操作的操作数不同,这时就可以采用循环程序结构。
它可以缩短指令数,减少程序所占的内存空间。
程序三:数据块传送将片外RAM中地址为4500H~450FH中的数据块传送到4700H~470FH单元中。
参考程序:地址目的程序源程序ORG 1000H1000 7A00 MOV R2,#00H1002 7B45 MOV R3,#45H1004 904700 MOV DPTR,#4700H1007 C083 LOOP:PUSH DPH1009 C082 PUSH DPL100B 8A82 MOV DPL,R2100D 8B83 MOV DPH,R3100F E0 MOVX A,@DPTR1010 D082 POP DPL1012 D083 POP DPH1014 F0 MOVX @DPTR,A1015 A3 INCDPTR1016 0A INCR21017 BA10ED CJNE R2,#10H,LOOP101A 80FE SJMP $END五、实验步骤1、认真阅读实验参考程序并分析程序运行后的理论结果;2、输入程序并检查输入是否正确;3、根据已知条件输入程序执行前的原始数据;4、执行程序,检查并记录结果;六、练习1、将ASCII码转化为十六进制数。
实验四分支和循环程序设计实验一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言分支程序基本指令的使用方法;3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;4.了解汇编语言循环程序设计的基本流程;5.熟悉汇编语言循环基本指令的使用方法;6.掌握利用汇编语言的循环指令完成循环程序设计方法。
二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有 MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识在实际应用中,经常根据一些条件来选择一条分支执行。
汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。
1.无条件转移指令 JMP无条件转移指令 JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。
2.条件转移指令 JXX条件转移指令可分为三大类:1).简单条件转移指令指令。
根据单个标志位的状态判断转移条件。
标志位指令转移条件意义CFJC CF=1 有进位/借位JNC CF=0 无进位/借位ZFJE/JZ ZF=1 相等/等于 0JNE/JNZ ZF=0 不相等/不等于 0SFJS SF=1 是负数JNS SF=0 是正数OFJO OF=1 有溢出JNO OF=0 无溢出PFJP/JPE PF=1 有偶数个 1JNP/JPO PF=0 有奇数个 12).无符号数条件转移指令。
假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是 A-B,其转移指令如下:指令转移条件意义JA/JNBE CF=0 AND ZF=0 A>BJAE/JNB CF=0 OR ZF=1 A>=BJB/JNAE CF=1 AND ZF=0 A<BJBE/JNA CF=1 OR ZF=1 A<=B3).带符号数条件转移指令。
指令转移条件意义JG/JNLE SF=OF AND ZF=0 A>BJGE/JNL SF=OF OR ZF=1 A>=BJL/JNGE SF OF AND ZF=0 A<BJLE/JNG SF OF OR ZF=1 A<=B四、实验内容与步骤1、判断方程 AX2+BX+C=0是否有实根。
实验四组合电路中的竞争和冒险姓名:zht学号:班级:15自动化2班日期:2016/10/28目录一、实验内容 (3)二、逻辑图、真值表及实验方法和步骤 (4)①逻辑图: (4)②真值表: (4)③实验方法和步骤: (5)三、实验数据及总结 (7)①实验数据: (7)②总结: (10)一、实验内容实现函数D⋅=,并假定,输入只有原变量即无反变F⋅⋅CADBAB量输入。
1.画出逻辑图,使易于观察电路的竞争冒险现象。
2.列出真值表。
3.静态测试,即按真值表验证其逻辑功能。
4.观察变量A变化过程中的险象:即取B=C=D=1,得F=A+A,A改接函数发生器的连续脉冲源,使工作频率尽可能高。
观察是否出现险象,如有,请测出毛刺的幅度和宽度(中值宽度)。
5.分别观察变量B、D变化过程中产生的险象。
6.用加冗余项法消除A变化过程中产生的险象。
实验仪器:1.数字电路实验箱、数字万用表、示波器。
2.器件:74LS00、74LS20。
二、逻辑图、真值表及实验方法和步骤①逻辑图:②真值表:③实验方法和步骤:观察险象的方法:调整A、B、C、D四个输入中其中三个的值,化简函数使F=x+x或F=x x(x为剩下的那个输入值)。
再将输出F接入示波器的输入端,即可观察到x变化过程中的险象。
比如取B=C=D=1,使F=A+A,再将F接入示波器的输入端,即可通过示波器观察到A 变化过程中的险象。
观察险象的步骤:按照逻辑图连接好电路,静态检测确认无误后,将B、C、D的模拟开关调为1,A接连续脉冲,将输出F接入示波器的输入端,调整示波器使其显示输入的波形,即可观察A变化过程中的险象。
若要观察B变化过程中的险象,则需调整模拟开关使A=1、C=1、D=0;若要观察D变化过程中的险象,则需调整模拟开关使A=0、B=0、C=1,其他步骤不变。
消除险象的方法:首先绘制该函数的卡诺图如下所示:我们的目的是消除A变化过程中产生的险象,所以只考虑A。
可以看出卡诺图中在没有黄色的圈的情况下红色的圈之间有间隙,表达到实际电路上的含义则是当B=C=D=1时会遗留独立的A和A相加,产生冒险现象。
实验四、分支循环结构程序设计一、实验目的1.通过本实验,加深对循环控制结构有关概念的理解。
2.熟练掌握while、do-while和for三种循环控制语句的特点,掌握循环结构程序设计和调试方法。
3.掌握二重循环结构程序的设计方法。
二、实验内容1.用while循环实现数据统计问题。
数据统计问题:从键盘输入一批任意数量的整数,统计其中不大于100的非负数数值的个数。
2.编写并调试程序,使用do-while循环控制语句实现上面的数据统计问题。
调试数据仍参照上面给出的几种情况设计使用。
3.编写并调试程序,使用for循环控制语句实现上面的数据统计问题。
4.阶乘累加问题。
编写程序,求1+2!+3!+…+n!的值(习题5.9)。
三、实验指导1.用while循环实现数据统计问题。
⑴编程分析由于输入数据个数是不确定的,因此每次执行程序时,循环次数都是不确定的。
在进行程序设计时,确定循环控制的方法是本实验的一个关键问题。
循环控制条件可以有多种确定方法:①使用一个负数作为数据输入结束标志。
②输入一个数据后通过进行询问的方式决定是否继续输入下一个数据。
⑵参考程序l 参考程序一/* 使用负数作为数据输入结束标志的程序 */#include "stdio.h"void main()int m,counter=0;while(1)printf("请输入一个整数:");scanf("%d",&m);if(m<0)break;if(m<=100)counter++;printf("\n");printf("符合要求的整数个数为: %d\n",counter);l 参考程序二/* 通过进行询问的方式决定是否继续输入下一个数据的程序 */#include "stdio.h"void main()int m,counter=0;char ask;while(1)printf("请输入一个整数:");scanf("%d",&m);getchar();if(m>=0&&m<=100)counter++;printf("继续输入下一个数据?(Y/N)");ask=getchar();getchar();if(ask!='y'&&ask!='Y')break;printf("\n");printf("符合要求的整数个数为: %d\n",counter);⑶程序调试这里只对“参考程序一”的调试数据进行设计。
实验四 组合电路的竞争冒险1.实验目的通过实验观察组合电路中存在的竞争冒险现象,学会用实验手段消除竞争冒险对电路的影响。
2.实验原理在组合逻辑电路里,信号从输入到输出的过程中,由于不同通路上门的级数不同,或者门电路平均延迟时间的差异,使信号从输入经不同通路传输到输出级的时间不同。
由于这个原因,可能会使逻辑电路产生错误输出。
通常把这种现象称为竞争冒险。
下面是一个最简单的例子。
在图4.1(a )的与门电路中,无论A=1、B=0还是A=0、B=1,输出皆为Y=0。
但是,如果输入信号A 从1跳变为0时,B 从0跳变为1,而信号B 首先上升到以(max)IL V 以上,这样在极短的时间T 内将出现A 、B 同时高于(max)IL V 的状态,于是便在门电路的输出端产生了极窄的Y=1的尖峰脉冲,或称为电压毛刺,如图所示(在画波形时考虑了门电路的传输延迟时间)。
显然,这个尖峰脉冲不符合门电路在稳态下的逻辑关系,因而它是系统内部的噪声。
同样,在图4.1(b )的或门电路中,无论A=0、B=1还是A=1、B=0,输出都应该是Y=1。
但如果A 从1变成0的时刻和B 从0变成1的时刻略有差异,而且在A 下降到(min)IH V 时B 还没有上升到(min)IH V ,则在暂短的t ∆时间内将出现A 、B 同时低于(min)IH V 的状态,使输出端产生极窄的Y=0的尖峰脉冲。
这个脉冲同样也是违背稳态下关系的躁声。
我们把门电路两个输入信号同时向相反的逻辑电平跳变(一个从1变为0,另一个从0图4.1 组合电路中的竞争冒险B&≥11AA B Y Y Y tA B IH(min)IH(min)tY变为1)的现象叫做竞争。
应当指出,有竞争现象时不一定都会产生尖峰脉冲。
例如,在图4.1(a )中,如果在B 上升到(max)IL V 之前A 已经降到了(max)IL V 以下(如图中虚线所示),这时输出端不会产生尖峰脉冲。
简述影响指令执行时间的主要不确定因素——处理器流水线机制论坛上经常有人问,某段语句的执行时间是多少;或者是某几段语句,那段执行时间快。
绝大多数朋友也会带着好奇的观点,在旁边观战;通常的回答是:你看芯片手册吧。
类似的帖子和类似的回答很多,但是很少有人能把这个问题回答的清晰和彻底。
我觉得,这种提问本来就不专业,答案也不唯一。
至于原因?因为一条指令的执行时间不仅取决于处理器的频率,还取决于许多处理器以外的因素。
芯片手册上指令的执行时间,通常是不考虑外界因素的:不考虑总线冲突、不考虑内存延迟、不考虑高速缓存机制、不考虑流水线的相关性等。
这里我打算分两次主要介绍下,高速缓存和处理器的流水线机制如何影响指令的执行时间的。
本次先介绍流水线相关机制。
1. 流水线技术现代绝大多数的处理器在某个时刻,并不是只处理一个指令,而是按照流水线的形式处理,这和我们实际生活中,车间里的流水线是一个原理。
下面我们假设某个处理器有三级流水线:译指/运算/写存。
这里只是假设,不要对号入座。
译指:处理器读取并分析指令的功能,比如mov是赋值,add是加法;译指为下一步的运算提供数据输入和选择相应的硬件单元。
运算:处理器进行加减乘除移位比较等等运算,不需要运算的指令进行下一步骤“排队”。
写存:处理器将运算单元的输入写回内存或者寄存器,并更新pc。
假设该处理器正在处理四条指令ABCD。
每条指令又有三个处理过程,即译指/运算/写存。
某个时刻处理器的状态如下:流水线某个时刻各处理单元的状态为:| C指令译指 | B指令运算 | A指令写存 |一个core clock(处理器时钟)后,流水线的状态为:| D指令译指 | C指令运算 | B指令写存 |流水线的每个阶段,都可以设计出独立的硬件单元,这些单元之间可以并行运行,从而提高了处理器的并行处理能力。
我们假设流水线的每个阶段需要耗时1ns,一条指令的完整执行时间就是3ns;不采用流水线时,指令的完整执行时间是3ns。
流⽔线分析例题例1:MIPS 流⽔线,后半拍写 GPRs。
求阻塞法处理 RAW 冒险时的执⾏时间。
ADD R4,R5,R6SUB R7,R4,R6OR R8,R4,R6SW R6,20(R4)LW R9,20(R8)I1-I2 冒险,停 3 拍。
此时 I1-I3, I1-I4 均已消除。
I3-I5 冒险,停 2 拍。
故执⾏时间为 5+4+3+2=14拍。
例2:MIPS 流⽔线,前半拍写 GPRs。
求转发法处理 RAW 冒险时的执⾏时间。
假设存在 EX-EX,MEM-EX 的转发线路。
ADD R4,R5,R6SUB R7,R4,R6OR R8,R4,R6SW R6,20(R4)LW R9,20(R8)I1-I2 冒险,利⽤ EX-EX 线路转发,停 0 拍。
I1-I3 冒险,利⽤ MEM-EX 线路转发,停 0 拍。
I1-I4 冒险,同拍内 GPRs 先写后读,停 0 拍。
I3-I5 冒险,利⽤ MEM-EX 线路转发,停 0 拍。
故执⾏时间为 5+4=9 拍。
例3:MIPS 流⽔线,前半拍写 GPRs。
求转发法处理 RAW 冒险时的执⾏时间。
假设仅存在 EX-EX 的转发线路。
ADD R4,R5,R6SUB R7,R4,R6OR R8,R4,R6SW R6,20(R4)LW R9,20(R8)I1-I2 冒险,利⽤ EX-EX 线路转发,停 0 拍。
I1-I3 冒险,⽆法转发,停 1 拍(注意不是 2 拍!)。
此时 I1-I4 冒险已经消除。
I3-I5 冒险,⽆法转发,停 1 拍。
故执⾏时间为 5+4+1+1=11 拍。
例4:MIPS 流⽔线,后半拍写 GPRs。
求转发法处理 RAW 冒险时的执⾏时间。
假设仅存在 EX-EX 的转发线路。
ADD R4,R5,R6SUB R7,R4,R6OR R8,R4,R6SW R6,20(R4)LW R9,20(R8)I1-I2 冒险,利⽤ EX-EX 线路转发,停 0 拍。
深圳大学实验报告课程名称:计算机系统(3)实验项目名称:处理器结构实验二学院:********专业:*******************指导教师:*******报告人:**** 学号:***** 班级:************* 实验时间:2017年12月6日星期三实验报告提交时间:2017年12月21日星期四教务处制注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
一、试验目的——控制冒险与分支预测了解控制冒险分支预测的概念了解多种分支预测的方法,动态分支预测更要深入了解理解什么是BTB(Branch Target Buffer),并且学会用BTB来优化所给程序利用BTB的特点,设计并了解在哪种状态下BTB无效了解循环展开,并于BTB功能进行对比对WinMIPS64的各个窗口和操作更加熟悉二、实验内容按照下面的实验步骤及说明,完成相关操作记录实验过程的截图:首先,给出一段矩阵乘法的代码,通过开启BTB功能对其进行优化,并且观察流水线的细节,解释BTB在其中所起的作用;其次,自行设计一段使得即使开启了BTB也无效的代码。
第三,使用循环展开的方法,观察流水因分支停顿的次数减少的现象,并对比采用BTB结构时流水因分支而停顿的次数。
(选做:在x86系统上编写C语言的矩阵乘法代码,用perf观察分支预测失败次数,分析其次数是否与你所学知识吻合。
再编写前面第二部使用的令分支预测失败的代码,验证x86是否能正确预测,并尝试做解释)三、实验环境硬件:桌面PC软件:Windows四、实验步骤及说明背景知识在遇到跳转语句的时候,我们往往需要等到MEM阶段才能确定这条指令是否跳转(通过硬件的优化,可以极大的缩短分支的延迟,将分支执行提前到ID阶段,这样就能够将分支预测错误代价减小到只有一条指令),这种为了确保预取正确指令而导致的延迟叫控制冒险(分支冒险)。
为了降低控制冒险所带来的性能损失,一般采用分支预测技术。
分支预测技术包含编译时进行的静态分支预测,和执行时进行的动态分支预测。
这里,我们着重介绍动态分支预测中的BTB(Branch Target Buffer)技术。
BTB即为分支目标缓冲器,它将分支指令(对应的指令地址)放到一个缓冲区中保存起来,当下次再遇到相同的指令(跳转判定)时,它将执行和上次一样的跳转(分支或不分支)预测。
一种可行的BTB结构示意图如下:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
在采用了BTB 之后,在流水线各个阶段所进行的相关操作如下:注意,为了填写BTB ,需要额外一个周期。
一、矩阵乘法及优化在这一阶段,我们首先给出矩阵乘法的例子,接着将流水线设置为不带BTB功能(configure->enable branch target buffer)直接运行,观察结果进行记录;然后,再开启BTB 功能再次运行,观察实验结果。
将两次的实验结果进行对比,观察BTB是否起作用,如果有效果则进一步观察流水线执行细节并且解释BTB起作用原因。
矩阵乘法的代码如下:.datastr: .asciiz "the data of matrix 3:\n"mx1: .space 512mx2: .space 512mx3: .space 512.textinitial: daddi r22,r0,mx1 #这个initial模块是给三个矩阵赋初值daddi r23,r0,mx2daddi r21,r0,mx3input: daddi r9,r0,64daddi r8,r0,0loop1: dsll r11,r8,3dadd r10,r11,r22dadd r11,r11,r23daddi r12,r0,2daddi r13,r0,3sd r12,0(r10)sd r13,0(r11)daddi r8,r8,1slt r10,r8,r9bne r10,r0,loop1mul: daddi r16,r0,8daddi r17,r0,0loop2: daddi r18,r0,0 #这个循环是执行for(int i = 0, i < 8; i++)的内容loop3: daddi r19,r0,0 #这个循环是执行for(int j = 0, j < 8; j++)的内容daddi r20,r0,0 #r20存储在计算result[i][j]过程中每个乘法结果的叠加值loop4: dsll r8,r17,6 #这个循环的执行计算每个result[i][j]dsll r9,r19,3dadd r8,r8,r9dadd r8,r8,r22ld r10,0(r8) #取mx1[i][k]的值dsll r8,r19,6dsll r9,r18,3dadd r8,r8,r9注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
dadd r8,r8,r23ld r11,0(r8) #取mx2[k][j]的值dmul r13,r10,r11 #mx1[i][k]与mx2[k][j]相乘dadd r20,r20,r13 #中间结果累加daddi r19,r19,1slt r8,r19,r16bne r8,r0,loop4dsll r8,r17,6dsll r9,r18,3dadd r8,r8,r9dadd r8,r8,r21 #计算result[i][j]的位置sd r20,0(r8) #将结果存入result[i][j]中daddi r18,r18,1slt r8,r18,r16bne r8,r0,loop3daddi r17,r17,1slt r8,r17,r16bne r8,r0,loop2halt不设置BTB功能,运行该程序,观察Statistics窗口的结果截屏并记录下来。
接着,设置BTB功能(在菜单栏处选择Configure项,然后在下拉菜单中为Enable Branch Target Buffer选项划上钩)。
并在此运行程序,观察Statistics窗口的结果并截屏记录下来。
在这里,我们仅仅观察比较Stalls中的最后两项------Branch Taken Stalls和Branch Misprediction Stalls。
接下来,对比其结果。
我们就结合流水线执行细节分析造成这种情况发生的原因。
(30分,结果的获取10分,细节分析20分)二、设计使BTB无效的代码在这个部分,我们要设计一段代码,这段代码包含了一个循环。
根据BTB的特性,我们设计的这个代码将使得BTB的开启起不到相应的优化作用,反而会是的性能大大降低。
提示:一定要利用BTB的特性,即它的跳转判定是根据之前跳转成功与否来决定的。
给出所用代码以及设计思路,给出运行结果的截屏证明代码实现了目标。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
(30分,代码及思路20,获取结果并证明目标实现10分)三、循环展开与BTB的效果比对首先,我们需要对循环展开这个概念有一定的了解。
什么是循环展开呢?所谓循环展开就是通过在每次迭代中执行更多的数据操作来减小循环开销的影响。
其基本思想是设法把操作对象线性化,并且在一次迭代中访问线性数据中的一个小组而非单独的某个。
这样得到的程序将执行更少的迭代次数,于是循环开销就被有效地降低了。
接下来,我们就按照这种思想对上述的矩阵乘法程序进行循环展开。
要求将上述的代码通过循环展开将最里面的一个执行迭代8次的循环整个展开了,也就是说,我们将矩阵相乘的三个循环通过代码的增加,减少到了两个循环。
比较,通过对比循环展开(未启用BTB)、使用BTB(未进行循环展开)以及未使用BTB 且未作循环展开的运行结果。
比较他们的Branch Tanken Stalls和Branch Misprediction Stalls的数量,并尝试给出评判。
(30分,循环展开代码及思路20分,评判10分)四、结束语写下对于这次试验的所得与感想。
(报告撰写质量10分)注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
一、矩阵乘法及优化1.不设置BTB功能,运行该程序,观察Statistics窗口的结果截屏并记录下来。
2.接着,设置BTB功能(在菜单栏处选择Configure项,然后在下拉菜单中为Enable Branch Target Buffer选项划上钩)。
并在此运行程序,观察Statistics窗口的结果并截屏记录下来。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
3.我们发现Branch Taken Stalls减少了,Branch Misprediction Stalls增加了。
3.1在Cycles窗口中进行对比,我们可以发现在没有BTB的时候:3.1.1第一次分支跳转错误,但是没有进行任何记录。
产生了一次控制冒险(还有一次数据冒险这里不再讨论)。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
3.1.2第二次分支跳转仍然错误,但是没有进行记录。
又产生了一次控制冒险(还有一次数据冒险这里不再讨论)。
3.2我们可以发现在有BTB的时候:3.2.1第一次分支跳转错误,但是进行了记录。
产生了一次控制冒险,和一次记录BTB的阻塞。
(还有一次数据冒险这里不再讨论)。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
3.2.2第二次由于有过记录,分支跳转正确。
没有产生控制冒险,由于预测正确,也没有产生由于记录BTB的阻塞。
(还有一次数据冒险这里不再讨论)。
3.2.3在最后一次预测中,分支跳转错误,产生了一次控制冒险和一次由于记录BTB引起的阻塞。
(还有一次数据冒险这里不再讨论)。
因此,在开启BTB后,预测错误会增加两个阻塞,预测正确会减少一个阻塞。
即Branch Taken Stalls减少,Branch Misprediction Stalls增加。
二、设计使BTB无效的代码1.在这个部分,我们要设计一段代码,这段代码包含了一个循环。
根据BTB的特性,我们设计的这个代码将使得BTB的开启起不到相应的优化作用,反而会是的性能大大降低。
1.1编写代码,计算0-18所有偶数的和.data.text注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
daddi r8,r0,0 # 计数器daddi r9,r0,0 # 总和daddi r11,r0,18 # 最大值loop: beq r8,r11,enddaddi r8,r8,1bne r10,r0,zerodadd r9,r9,r8daddi r10,r0,1j loopzero: daddi r10,r0,0j loopend: halt1.2关闭BTB1.3开启BTB1.4通过反复切换跳转和不跳转,让BTB的预测错误,增大预测成本。