分支预测分析

226 篇文章 94 订阅

一、定义

在前面的文章“C++20中的分支预测”中,对C++20中的静态分支预测进行了分析说明。本文从整体上对分支预测(Branch Prediction)进行一个全面的分析说明。首先来看一个分支预测的定义:由CPU预判程序分支的执行指令,从而减少错误方向的选择,加快运算速度。这项技术是从P5(奔腾5)处理器开始应用的。
分支预测可以分为动态分支预测和静态分支预测两种。静态分支预测其实就是在编译程序时直接预测分支跳转的方向;而动态分支预测就是在程序运行时根据一定的算法来预测分支跳转方向。静态预测其实可以理解成没有技术含量的预测,只是根据给定条件确定即可。

二、分析和说明

提到分支预测,就必须得提到CPU中的流水线技术。在CPU的流水线技术中,有三类情况会打断流水线作业:
1、硬件不匹配,即当前流水线指令需要的硬件仍然在工作,无法提供支持
2、数据不匹配,即当前流水线指令需要的数据仍然在被其它指令操作
3、控制不匹配,即当前指令的执行与否由上一条指令结果确定,但上条指令仍然在工作
RISC-V指令集中有四种跳转指令,即条件分支指令、直接跳转扒和间接跳转指令以及函数调用返回指令。统计分析表明,在RISC-V指令集中,分支指令中 72%是条件分支,17%是无条件立即转指令,10%是返回指令,1%是间接分支指令。
而上面的三种打破流水线作业的情况都可能引起指令的跳转。而这种跳转指令又可以导致分支预测,即跳转方向的预测、普通的地址预测以及调用/返回的地址预测。

三、静态分支预测

无论是静态亦或动态分支预测,又可以包含一级或二级预测器。前面提到过,静态预测其实类似于一种猜测或者直接给定条件下的静态决定。在没有外来干预的情况下,基本就是随机或者凭经验选择一个分支。
静态分支预测可以分为以下几种:
1、一律不跳转,按原来的路径走
2、一律跳转,随便找一个跳转
3、BTFN(Backward taken, forward not taken),就是跳转目标地址比当前分支指令PC小,则向前跳;否则向后跳。
4、Profile based(likely direction),利用编译器的探针确定可能的分支方向来确定最终的跳转指令
5、Program based (likely direction),根据ISA指令来确定预测方向
6、Programmer based,由程序员提供静态预测,利用编译器确定预测方向,如前面讲分的linkely等。
静态分支预测一般来说实现都比较简单(硬件实现也比较简单),但缺点也比较明显就是预测不是太准。

四、动态分支预测

动态分支预测一般都是基于历史的变化来确定本次的跳转方向,它可以分成类:
1、Last time prediction(1 bit计数器),参考上一次的跳转结果作为本次跳转的预测。通过BTB的每一位来保存分支执行方向。
2、2bit饱和计数器预测,和1bit计数器没有本质区别,只是参考的结果更多了一些
3、基于局部历史的分支预测,其实就是把局部的跳转历史记录并进行分析
4、基于全局历史的分支预测,就是除记录此指令的历史外再把其它分支指令结果的加以辅助
5、混合分支预测,这个就好理解了,使用多种分支预测器来预测
动态预测相对静态预测,实现就复杂一些,特别是二级动态预测器的实现电路更是复杂,但优点就是准确性要高。

五、二级预测器

其实所谓的二级预测器就是因为预测时,受到的影响太多,特别是更多个维度的影响,所以就需要从更多的维度来确定跳转的方向,比如上面的基于局部历史和全局历史以及混合的都可以算做二级预测器,在现代的预测器中主要有两种:
1、基于感知机的分支预测器,这个没有学过AI可能理解起来有点麻烦,大家还是自行查找一下相关资料。它的优点是支持较长的历史长度,准确率更高。缺点是硬件设计复杂并且只能学习线性函数。
2、基于Tage的分支预测器,Tage(TAgged GEometric history length),标记几何历史长度。它的优点是利用不同的长度历史可以选择最佳的结果,从而获得更高的跳转准确率;缺点也是硬件电路设计复杂,哈希函数和table size的处理有限。现代的高性能处理器很多都应用了这种分支预测器。

六、总结

越是学习编程并且深入到其内部,一些在上学时觉得没什么大用的计算体系原理或者操作系统等知识突然发现就非常有用了。编程不是一个空中楼阁,它是有一系列底层的基础体系和理论支持的。可能绝大多数开发者在实际的开发中大量的基础知识和底层技术被反复屏蔽,导致对底层的意义理解越来越淡。但真正遇到关键问题需要解决时,还是需要拿出这些知识进行分析总结,才能找到解决问题的思路和方法。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值