体系结构实验(5)——分支预测

Chp5 Lab: Branch Prediction

Q1

Run the following code (exercise 3.3) fragment in WinMIPS64 simulator with forwarding and BTB hardware.

LOOP:    LW       R1,0(R2)      ;    load R1 from address 0+R2
ADDI     R1,R1,#1      ;    R1=R1+1
SW       0(R2),R1      ;    store R1 at address 0+R2
ADDI     R2,R2,#4      ;    R2=R2+4
SUB      R4,R3,R2      ;    R4=R3-R2
BNEZ    R4,Loop        ;    branch to loop if R4!=0

Assume that the initial value of R3 is R2+396.

Show a pipeline timing diagram, compute the number of cycles needed to execute the entire loop and contrast it with the experiment result.

使用转发和BTB硬件(分支目标缓冲器)在WinMIPS64模拟器中运行以下代码片段。假设R3的初始值是R2+396。显示一个管道时序图,计算执行整个循环所需的周期数,并与实验结果进行对比。

1.1 理论分析

  • 原理分析

    使用BTB的指令执行原理图如下:
    在这里插入图片描述

  • 过程分析

第一次执行转移指令BNEZ R4,Loop

此时 BTB 表为空

执行过的成功分支指令的地址预测的分支目标地址
--

因此 在BTB表中未找到该PC值对应的预测分支目标地址,但是接下来第一条转移成功的指令,因此需要将该指令以及目标地址送入缓冲器中。此时,BTB的内容如下表:

执行过的成功分支指令的地址预测的分支目标地址
BNEZ R4,Loop 语句的地址LW R1,0(R2) 语句的地址

从Cycle2 开始进入第一次循环,cycle12时开始进入第二轮循环。记第i次循环的开始时钟周期数为 S i S_i Si, 故 S 1 S_1 S1=2

1234567891011121314151617
daddi r2,r0,0FDXMW
daddi r3,r2,396FDXMW
lw r1,0(r2)FDXMW
daddi r1,r1,1FDX-MW
sw r1,0(r2)FD-XMW
daddi r2,r2,4F-DXMW
dsub r4,r3,r2FDXMW
bnez r4,loopFD--XMW
haltF--
lw r1,0(r2)FDXMW

接下来每次的循环过程中,当遇到转移指令BNEZ R4,Loop时,都可以从BTB表中找到该PC值。寄存器r4 的值不为0,所以是转移成功指令,BTB中的该表项不会被移除,直到循环的最后一次。

因此只有在第一次进入循环和最后一次退出循环的时候才会有额外的2个时钟周期的延时。中间的循环过程,都可以预测成功,因此不需要额外的延时。且在第一轮循环中,有两个RAW stalls 和两个Brach Taken Stalls (分支不在BTB表中,因此需要两个周期的额外延时),以及6个流水指令语句。因此第二轮的开始时间 S 2 = S 1 + 2 + 2 + 6 = 12 S_2=S_1+2+2+6=12 S2=S1+2+2+6=12

从第二轮循环开始,每次在分支跳转的过程中都可以从BTB表中找到PC值,因此不会有额外的分支跳转延时。且在第二轮的循环过程中只有一次RAW stall, 以及6个流水指令语句。每次因此第三轮循环的开始时间为S_3=S_2+1+6=19

由于R3的初始值为R2+396, 并且在每次的循环过程中R2都会加上4。循环的条件是R4不等于0。由于R4=R3-R2, 即当R2=R3时结束循环。所以循环的总次数为396/4=99

12345678910111213
lw r1,0(r2)FDXMW
daddi r1,r1,1FDXMW
sw r1,0(r2)FD-XMW
daddi r2,r2,4F-DXMW
dsub r4,r3,r2FDXMW
bnez r4,loopFD-XMW
lw r1,0(r2)F-DXMW

第三轮循环到第98轮循环的过程中每次都只有2个RAW stalls,以及6个流水指令语句。 因此相邻两个循环开始执行时间相差6+2=8个周期。 因此第99轮循环的开始执行时间为 S 99 = S 3 + 8 ∗ ( 99 − 3 ) = 19 + 8 ∗ 96 = 787 S_{99}=S_3+8*(99-3)=19+8*96=787 S99=S3+8(993)=19+896=787

123456789101112131415
lw r1,0(r2)F-DXMW
daddi r1,r1,1FDXMW
sw r1,0(r2)FD-XMW
daddi r2,r2,4F-DXMW
dsub r4,r3,r2FDXMW
bnez r4,loopFD-XMW
lw r1,0(r2)F--
haltFDXMW

循环的最后一次时,r4=0 需要跳出循环,但是在取到指令BNEZ R4,Loop 时,仍然可以在BTB表中找到预测项,因此会在ID段就立刻从预测的PC处取指。但是由于是一个不成功的转移,需要将其从缓冲器中移除。BTB表被清空。

执行过的成功分支指令的地址预测的分支目标地址
--

在最后一次循环过程中由于预测错误,因此有2个brach mispredictioin stalls。 以及6个流水化指令和2个RAW stalls。外加上等待最后一条halt指令执行结束,共需要16个时钟周期。

  • 性能分析
指令是否在BTB表中预测结果是否转移时间代价
转移转移0 stalls
转移不转移2 stalls
不转移转移2 stalls
不转移不转移0 stalls

因此总的时钟周期为** S 99 + 16 = 787 + 16 = 803 S_{99}+16=787+16=803 S99+16=787+16=803**

1.2 实验验证

  1. 首先点击Configure进行配置,选择Enable Forwording Enable Branch Target Buffer

在这里插入图片描述

  1. 运行该代码
   .data
   .text
   DADDI R2,R0,0
   dADDI R3,R2,396 
   LOOP:	LW r1,0(r2) 
   	dADDI r1,r1,1 
   	SW r1,0(r2)
   	dADDI r2,r2,4
   	dSUB r4,r3,r2
   	BNEZ r4,LOOP
   end:	halt

由于R3的初始值是R2+396,因此在原先代码的基础上添加了前两条初始化的语句。

然后单步执行指令代码,前两个时钟周期用来执行初始化语句。

在这里插入图片描述

第一次循环过程中有两次RAW stalls ,以及首次分支预测错误,有2个Branch Taken Stalls.。
在这里插入图片描述

第2次循环中只有一次RAW stalls,以及从第二次开始不会出现分支预测错误。
在这里插入图片描述

在最后一轮的循环过程中。

在这里插入图片描述

123456789101112131415
lw r1,0(r2)F-DXMW
daddi r1,r1,1FDXMW
sw r1,0(r2)FD-XMW
daddi r2,r2,4F-DXMW
dsub r4,r3,r2FDXMW
bnez r4,loopFD-XMW
lw r1,0(r2)F--
haltFDXMW

统计结果显示,一共198次RAW stalls(每轮循环都有两次RAW stalls, 99*2=198), 2 次Branch Taken Stalls(第一次循环), 2 次Branch Misprediction stalls (最后一次循环过程),共耗费了803个时钟周期,与理论计算结果相符合。

在这里插入图片描述

Q2

Run the above code in Mars simulator with BHT. Show and Analyze the results

使用BHT在Mars模拟器中运行上述代码。显示和分析结果

修改代码如下,添加初始化语句以及结束语句:

.text 
main:
addi $t2,$zero, 0x10010000
addi $t3,$t2,396
Loop: 
lw $t1,0($t2) 
addi $t1,$t1,1
sw $t1,0($t2)
addi $t2,$t2,4
sub $t4,$t3,$t2 
bnez $t4,Loop 
Finish:
 	li $v0, 10
	syscall

然后在Tools 选项栏中勾选BHT Simulator

在这里插入图片描述

  • 选择记录的历史条数为1。

    在第一次进入循环的过程中,History为NT , Prediction 为NOT TAKEN
    在这里插入图片描述

在遇到跳转指令时,预测错误,Incorrect 的值增加为1。 修改History的表项为T, 以及Prediction 修改为Taken。

在这里插入图片描述

在接下来的循环中,每次都可以预测成功。

在这里插入图片描述

直到最后一次循环过程中,预测失败。因此总共有两次预测失败(第一次和最后一次),中间的97次预测成功。总体的预测成功率为97.98%。

在这里插入图片描述

  • 选择历史记录条数为2

    初始时,History为NT,NT , 预测值为Not Taken
    在这里插入图片描述

第一次循环跳转,分支预测错误,incorrect的数量加1。并修改History为NT,T。 预测值仍为NOT TAKEN

在这里插入图片描述

第二次循环跳转,分支预测错误,incorrect的数量加1。修改History为T,T ,并修改Prediction为Taken。

在这里插入图片描述

在接下来的循环中,每次都预测成功,History和Prediction的表项保持不变。

在这里插入图片描述

直到最后一次循环,预测失败。History的值变为T,NT ,Prediction的预测值仍为Taken 。

在这里插入图片描述

总共99次的循环中,有三次预测失败(第一次和第二次以及最后一次),其余的均预测成功。准确率为96.97。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 流水线分支预测是一种在计算机体系结构中常用的技术,用于优化指令执行的效率。在使用Vivado进行流水线分支预测时,我们可以通过以下几个步骤来实现。 首先,需要明确流水线分支预测的目标是为了减少由于条件分支导致的指令流水线的停顿,从而提高程序的执行效率。在采用了流水线分支预测技术后,我们可以在分支指令的执行过程中预测分支的目标地址,并提前取出并执行该目标地址处的指令,从而减少流水线的停顿。 其次,Vivado提供了丰富的资源和工具来帮助我们实现流水线分支预测。其中,重要的组件之一是分支目标缓冲器(Branch Target Buffer,BTB),它可以存储分支指令的目标地址,并根据历史分支的结果来预测分支的目标地址。此外,Vivado还提供了分支预测器,它可以根据分支指令的特征来确定是否进行分支预测,并选择适当的预测策略。 在进行流水线分支预测时,我们还需要考虑分支指令的静态特征和动态特征。静态特征包括分支指令的类型和位置,动态特征则包括分支历史信息,如分支的执行结果。通过综合考虑静态特征和动态特征,我们可以选择合适的流水线分支预测策略,提高分支预测的准确性。 最后,我们需要进行仿真和验证,以确保流水线分支预测的正确性和有效性。通过运行实际程序和对比预测结果和实际结果,我们可以评估分支预测的准确性,并对优化策略进行调整。 总而言之,流水线分支预测vivado是一种有效的优化技术,可以提高分支指令的执行效率。通过合理选择分支预测策略,使用Vivado提供的工具和资源,我们可以实现准确、高效的分支预测。 ### 回答2: 流水线分支预测是指在计算机流水线操作中,为了解决分支指令带来的流水线停顿,采用“猜测”的方式来提前执行分支指令。Vivado是一种适用于FPGA设计的开发软件,通过Vivado可以对FPGA的设计进行综合、实现和生成比特流文件。 在流水线中,分支指令可能会导致流水线中断,因为在执行分支指令之前,无法确定分支的目标地址。为了充分利用流水线的并行性,可以采用分支预测的方法来提前执行分支指令。分支预测的基本原理是根据历史分支的结果,采用一定的算法对下一次分支的目标进行预测。如果预测正确,则可以提前执行分支指令;如果预测错误,则需要进行流水线中断和清空部分流水线指令。 Vivado是一种先进的FPGA设计开发软件,它提供了丰富的功能和工具,可以实现高效的FPGA设计。在Vivado中,流水线分支预测可以通过在设计中增加预测器来实现。预测器可以根据历史分支的结果进行训练,然后根据训练结果对下一次分支进行预测。通过使用Vivado中的分支预测功能,可以使得FPGA的设计在执行分支指令时可以更好地利用流水线的并行性,提高整体的性能。 总之,流水线分支预测是为了解决分支指令带来的流水线停顿问题而采用的一种技术。在Vivado中,可以通过增加预测器来实现流水线分支预测,从而提高FPGA设计的性能。 ### 回答3: Vivado 是赛灵思(Xilinx)公司推出的一款用于FPGA(现场可编程门阵列)开发的综合工具。流水线分支预测是一种用于提高CPU性能的技术,在Vivado 中也得到了支持。 流水线分支预测是指在程序执行过程中,当遇到条件分支指令(如if语句或循环)时,预测分支的方向,从而在程序继续执行之前预测下一条指令的位置。这种预测机制可以减少分支带来的流水线停顿,提高CPU的指令执行速度。 在Vivado 中,流水线分支预测的实现是通过逻辑电路和控制器相结合来完成的。Vivado 的软件工具提供了一些优化技术,如自动路由和时序优化,以便实现高效的流水线分支预测。这些技术可以帮助开发人员在FPGA中实现更好的预测性能,并最大程度地减少流水线停顿。 通过在Vivado 中配置适当的参数和设置,开发人员可以根据具体的应用需求来调整流水线分支预测的性能。Vivado 还提供了大量的文档和教程,以帮助开发人员理解和使用流水线分支预测功能。 总之,Vivado 是一款强大的FPGA开发工具,提供了流水线分支预测技术的支持。通过使用Vivado,开发人员可以有效地实现流水线分支预测,提高CPU性能和指令执行速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值