实验四 处理器结构实验二
——控制冒险与分支预测
试验目的
了解控制冒险分支预测的概念
了解多种分支预测的方法,动态分支预测更要深入了解
理解什么是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结构示意图如下:
在采用了BTB之后,在流水线各个阶段所进行的相关操作如下:
注意,为了填写BTB,需要额外一个周期。
一、矩阵乘法及优化
在这一阶段,我们首先给出矩阵乘法的例子,接着将流水线设置为不带BTB功能(configure->enable branch target buffer)直接运行,观察结果进行记录;然后,再开启BTB功能再次运行,观察实验结果。将两次的实验结果进行对比,观察BTB是否起作用,如果有效果则进一步观察流水线执行细节并且解释BTB起作用原因。
矩阵乘法的代码如下:
.data
str: .asciiz "the data of matrix 3:\n"
mx1: .space 512
mx2: .space 512
mx3: .space 512