分支预测

CPU设计之分支预测 如果我们在取指令阶段的时候,就可以“提前知道”该指令是否为分支指令,并且可以知道它的方向(跳或不跳),以及相应的目标地址(target address)的话,那么就可以直接在下一个周期从分支指令的目标地址开始取指令,这样就不会对流水线产生影响,从而避免了做无用功。对于这种不需要等待分支指令的结果真的被计算出来,而是提前就预测结果的过程就是分支预测。一件东西之所以可以被预测,一定是它本身具有某些特点,使得预测其成功的概率是大于百分之五十的,这种情况下做预测才有相应的意义,我们后面再展开讲这一点。 阅读详情

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。

  分支预测技术便是为解决这一问题而出现的。

  分支预测技术包含编译时进行的静态分支预测和硬件在执行时进行的动态分支预测。


静态分支预测:


  最简单的静态分支预测方法就是任选一条分支。1)认为branch一定会token;2)认为branch一定不会token;这样平均命中率为50%。更精确的办法是根据原先运行的结果进行统计从而尝试预测分支是否会跳转。

  任何一种分支预测策略的效果都取决于该策略本身的精确度和条件分支的频率。

       SPARC与MIPS的最早实现(作为第一代商用RISC体系结构处理器)使用单方向静态分支预测:总是预测条件跳转不发生,因此总是顺序取下一条指令投机执行。仅当条件跳转指令被求值确实发生了跳转,则非顺序的代码地址被加载执行。两种CPU都是在解码阶段评价分支指令,取指令占用1个周期。因此分支目标需要两个周期(即经过了去指令、解码两个周期)才能确定。两种处理器都会在分支指令进入流水线的执行阶段时,插入一个分支延迟间隙。分支指令完成流水线的执行阶段,就已经能确定是否跳转,这时就可以决定是后续的顺序出现的指令被继续执行还是跳转到的新指令进入流水。

    更复杂的静态预测假定向后分支将会发生,向前的分支不会发生。向后分支,是指跳转到的新地址比当前地址要低。这有助于配合经常出现的程序的循环控制结构。

    一些处理器允许分支预测提示出现在代码中。Intel Pentium 4就是如此。但这一特征在Intel此后的处理器中不再支持。

    静态预测也用于某些处理器分支动态预测没有任何可用信息时的一个最后的办法。Motorola MPC7450 


动态分支预测:


    动态分支预测是近来的处理器已经尝试采用的的技术。最简单的动态分支预测策略是分支预测缓冲区(Branch Prediction Buff)或分支历史表(branch history table)。

     BHT——Branch History Table,顾名思义,这是记录分支历史信息的表格,用于判定一条分支指令是否token;这儿记录的是跳转信息,简单点的,可以用1bit位记录,例如1表示跳转,0表示不跳转,而这个表格的索引是指令PC值;考虑在32位系统中,如果要记录完整32位的branch history,则需要4Gbit的存储器,这超出了系统提供的硬件支持能力;所以一般就用指令的后12位作为BHT表格的索引,这样用4Kbit的一个表格,就可以记录branch history了。当然,通过大伙的不懈努力和分析,发现在BHT中用1bit位记录分支是否跳转还不够准确,用2bit位记录就非常好了,而用3bit或者更多位记录,效果与2bit类似。所以在BHT中,一般就用2bit位记录分支是否跳转:例如11和10表示这条分支会跳转;01和00表示分支不会跳转。这个2bit计数器大伙叫做饱和计数器。


    BTB——用于记录一条分支指令的跳转地址,由于这儿存储的是指令地址,例如32位地址,因此,这个表格就不能做到存储BHT那样多的内容了,如果也支持4K条指令,则需要128Kbit的存储空间,这几乎可以赶上一个L1Cache的容量了,所以BTB一般很小,就32项或者64项。由于这个BTB容量小,并且其用于是记录分支指令的跳转地址,因此,如果这条指令不跳转,即其下一条指令就是PC+4,则不会在BTB中记录的。


      基于BTB和BHT的分支预测就很简单了:
      1)在取指阶段利用PC寻址BTB,如果命中,则说明这是一条跳转指令,利用从BTB中获取到的地址去取icache;
      2)由于BTB中保存的内容不够多,因此BHT的准确率更高,这个时候索引BHT表格,如果发现BHT也跳转,则说明这条指令预测是跳转的;如果BHT不跳转,则说明不跳转,这个时候就取消BTB中的指令地址,重新PC+4去取icache;

  


一些典型预测器介绍:

饱和计数

    饱和计数其(saturating counter)或者称双模态预测其(bimodal predictor)是一种有4个状态的状态机:


    2位饱和计数器

·         强不选择Strongly not taken

·         弱不选择Weakly not taken

·         弱选择Weakly taken

·         强选择Strongly taken

当一个分支命令被求值,对应的状态机被修改。分支不采纳,则向“强不选择”方向降低状态值;如果分支被采纳,则向“强选择”方向提高状态值。这种方法的优点是,该条件分支指令必须连续选择某条分支两次,才能从强状态翻转,从而改变了预测的分支。

最初的不具有MMX的Intel Pentium处理器使用了这种饱和计数器。虽然实现不够完美。

在SPEC'89 benchmark测评中, 饱和预测达到了93.5%正确率,如果每条条件分支指令都映射了自己的计数器。

预测器表使用条件分支指令的地址作为索引。因此处理器可以在分支指令解码前就给它分配一个预测器。


两级自适应预测器:

 

    两级自适应预测器。pattern history table中的每个条目是上文的2位饱和计数器。

    对于一条分支指令,如果每2次执行发生一次条件跳转,或者其它的规则发生模式,那么用上文提到的饱和计数器就很难预测了。如图所示,一种二级自适应预测器可以记住过去n次执行该指令时的分支情况的历史,可能的2n种历史模式的每一种都有1个专用的饱和计数器,用来表示如果刚刚过去的n次执行历史是此种情况,那么根据这个饱和计数器应该预测为跳转还是不跳转。

    例如,n = 2。这意味着过去的2次分支情况被保存在一个2位的移位寄存器中。因此可能有4种不能的分支历史情况:00, 01, 10, 11。其中0表示未发生跳转,1表示发生了分支跳转。现在,设计一个模式历史表(pattern history table),有4个条目,对应于2n= 4种可能的分支历史情况。4中历史情况的每一种都在模式历史表对应于一个2位饱和计数器。分支历史寄存器用于选择哪个饱和计数器供现在使用。如果分支历史寄存器是00,那么选择第一个饱和计数器;如果分支历史寄存器是11,那么选择第4个饱和计数器。

    假定,例如条件跳转每隔2次执行就发生一次,即分支情况的历史串行是001001001...。在这种情况下,00对应的饱和计数器将是状态“强选择”(strongly taken),表明在两个0之后必然是出现一个1。01对应的饱和计数器将是状态“强不选择”(strongly not taken),表示在01之后必然是出现一个0。这也同样适用于10状态。而11状态从未使用,因为不可能出现连续两个1。

      2级自适应预测器的一般规则是n位分支历史寄存器,可以预测在所有n周期以内出现的所有的重复串行的模式。

      2级自适应预测器的优点是能快速学会预测任意的重复模式。此方法1991年被提出。 已经变得非常流行。以此为基础很多变种方法被用于现代微处理。


本地分支预测:

本地分支预测(local branch predictor)对于每个条件跳转指令都有专用的分支历史情况缓冲区;模式历史表可以是专用的,也可以是所有条件分支指令共用。

Intel Pentium MMX, Pentium II, Pentium III使用本地分支预测器,记录4位的历史情况,每条条件跳转指令使用专用的本地模式历史表,当然是包含24= 16个条目。

对SPEC'89 benchmark测评,非常大的本地预测器的正确率达到97.1%。


全局分支预测:

全局分支预测器(global branch predictor)并不为每条条件跳转指令保持专用的历史记录。相反,它保持一份所有条件跳转指令的共用的历史记录。优点是能识别出不同的跳转指令之间的相关性。缺点是历史记录被不相关的不同的条件跳转指令的执行情况稀释了(diluted);甚至历史记录没有一位是来自同一个分支指令,如果有太多的不同的分支指令。

这种方法只有在历史缓冲区足够长,才能发挥出性能。但是模式历史表的条目数是历史缓冲区位数的指数量级。因此只能是在所有的条件跳转指令间共享这个大的模式历史表。

AMD的CPU,以及Intel的Pentium M, Core,Core 2使用了此种方法。

SPEC'89 benchmark评测,非常大的gshare预测器达到了96.6%正确率,略低于本地分支预测。


融合分支预测:

    融合分支预测器(alloyed branch predictor)组合了本地与全局预测原理,把本地与全局的分支历史情况连接(concatenating)起来。VIA Nano处理器可能采用此方法。

    Tournament预测器:整体局部自适应预测器
    Tournament预测器通过使用多个预测器-----其中一个基于全局信息,另一个基于局部信息,通过一个选择器将二者结合,而将这种方法又向前推进了一步。




    Tournament预测器的先进性在于,它可以为特定的转移选择正确的预测器,而这一点对于定点基准测试程序来说十分关键。Alpha的Tournament预测器由局部转移地址索引的4K个2bit计数器,在全局预测器和局部预测器间进行选择。

    全局预测器共有4K个入口,由最近执行的12个转移进行索引:其中每个入口为一个标准2bit预测器。局部预测器由两层组成。上层是由1024个10bit入口组成的局部历史表;每一个10bit入口对应这个转移最近10次的执行情况。

    局部历史表中被选中的入口用来对一个表进行索引,这个表由1K个入口组成,每个入口为3bit饱和计数器,该计数器用来进行局部预测。这种组合共使用了4K*2 +4K*2+1K*10 + 1K*3=29K bit。错误率在1.6%~4%之间。



Agree预测器:

Agree预测器是一种两级自适应全局预测器,但是附加了一个bias饱和计数器,用来记录历次预期的准确度。最终输出结果是全局预测与bias饱和计数器的异或。Intel Pentium 4使用了此种方法,但此后的Intel处理器放弃了此种方法。


循环预测器:

    程序循环的控制部分所对应的条件跳转指令最好用专门的循环控制器来预测分支。将要重复N次的循环的底部的条件跳转指令,前N-1次选择跳转,只有一次不跳转而是顺序执行。条件跳转指令有很多次选择了一条分支,只有一次选择另一分支,这种行为将被作为循环行为被检测。这种条件跳转指令可以用简单的计数器很容易地检测出来。循环预测器是一种混合预测器,其中元预测器判断该条件跳转指令是否具有循环行为。许多微处理器现在都有循环预测器。


间接跳转预测:

    间接跳转指令(indirect jump)是指操作数不是要转去的下一条指令地址(这是直接跳转),而是一个存储位置(寄存器或者内存),这个存储位置的内容才是要转去的下一条指令地址。例如je EAX,表示在ZF标志寄存器为1情况下,跳转到寄存器EAX所保存的内存地址开始的代码快。

    间接跳转指令可以选择多于两条分支的执行路线。Intel与AMD的更新的处理器使用两级自适应预测器能预测间接跳转。间接跳转指令在历史缓冲区贡献了超过1位的表示。没有这种预测机制的处理器,就简单地预测间接跳转指令是否会如同上次一样选择同一目标。


函数返回的预测:

    许多处理器有专门用于表示函数调用返回地址的return stack buffer。


overriding分支预测:

    快速与精确,是分支预测需要平衡的两个性能指标。有时就设置两个分支预测器。第一个是简单且快速。第二个是更慢、更复杂、表更大、可以覆盖第一个预测器作出的预测。

      Alpha 21264与Alpha EV8处理器使用一个快速的、单周期的下一行(next line)预测器处理分支目标,提供一个简单快速的分支预测。两个微处理器都有更复杂的、两个周期的分支预测其,可以覆盖下一行预测器的不准确的结果。

      Intel Core i7有两个分支目标预测器(Branch target predictor),可能有两个或更多分支预测器。


神经分支预测器:

      1999年提出的神经分支预测器(neural branch predictor)。突出优点是能够利用很长的历史记录,仅导致了资源的线性增长。而传统预测器的资源需要量与历史长度是指数增长关系。这种方法主要缺点是高延迟。

   神经分支预测器的准确度非常突出。(参见Intel's "Championship Branch Prediction Competition" )。Intel在IA-64的模拟器 (2003)中实现了这一方法。


其它总结性文献可参考论文: 《处理器分支预测研究的历史和现状》———冯子军 肖俊华 章隆兵

体系结构实验(5)——分支预测 从第二轮循环开始,每次在分支跳转的过程中都可以从BTB表中找到PC值,因此不会有额外的分支跳转延时。循环的条件是R4不等于0。因此 在BTB表中未找到该PC值对应的预测分支目标地址,但是接下来第一条转移成功的指令,因此需要将该指令以及目标地址送入缓冲器中。总共99次的循环中,有三次预测失败(第一次和第二次以及最后一次),其余的均预测成功。在接下来的循环中,每次都预测成功,History和Prediction的表项保持不变。的值不为0,所以是转移成功指令,BTB中的该表项不会被移除,直到循环的最后一次。 阅读详情

相关推荐

预测饱和计数器中的迟滞位(hysteresis bit)

迟滞位的提出则是基于以下思考: 一直以来在大多数分支预测器的设计中默认使用 2-bit 饱和计数器进行预测。之所以选取2-bit,是因为使用2-bit预测效果比一位更好,而使用超过2-bit也并不能获得可观的改进效果。 是否存在一个k-bit 的计数器,其中1<k<2,其预测效果不逊于2-bit计数器,例如,一个1.4-bit的计数器。当然,不可能实现一个1.4位的计数器,但如果几个计数器共享某些位,从开销上来讲二者是一致的。 2-bit 计...

qq_40379102的博客 1297

分支预测器(Branch Predictor) 汇总介绍

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。   分支预测技术便是为解决这一问题而出现的。   分支预测技术包含编译时进行的静态分支预测和硬件在

AddyLee的专栏 4万+

分支预测浅谈

本文通过一个对有序、无序数列进行判断求和程序效率问题的讨论进行引申, 分析处理器的分支预测对不同数据分布的程序运行性能影响,同时给出了利用位运算的优化方案。最后简要的介绍了处理器指令流水线的运作方式和分支预测器的作用。

Dingo 2837

分支预测详解

分支预测详解:分支预测用于在微处理器中以流水线效率为目标来预测程序流。有许多方法来实现分支预测,通常在更好的预测结果和增加硬件做预测之间需要进行权衡。

粉色挖掘机的博客 6609

(1)D触发器verilog描述

2.1 D触发器verilog描述 2.1.1 本节目录 第一,本节目录; 第二,本节引言; 第三,FPGA简介; 第四,verilog简介; 第五,D触发器verilog描述实例; 第六,结束语。 2.1.2 本节引言 给FPGA一个支点,它可以撬动整个数字逻辑。““给我一根杠杆我就能撬动地球”是古希腊数学家、物理学家阿基米德说的,这句话是阿基米德的经典语录,这句话还被翻译为“给我一个支点,我就能撬起整个地球”,用了夸张的方式来说明杠杆原理。” 2.1.3 FPGA简介 FPGA(F

kouq123的博客 7758

CAPL编程入门:从零开始掌握汽车通信脚本语言

本文详细介绍了CAPL编程的基础知识,从开发环境搭建到核心语法精要,再到总线通信实战和高级调试技巧。CAPL作为汽车通信脚本语言,专为CAN、LIN等网络协议设计,帮助工程师高效完成车载网络测试。通过实战案例和性能优化建议,读者可以快速掌握CAPL编程技能。

s1t2u3的博客 979

分支预测算法

主要讲述基础分支预测算法,方便入门学习。

2301_81405032的博客 2037

嵌入式音频架构 - AudioWeaver 整体概念

AudioWeaver 是DSP Concept公司推出的基于嵌入式平台的音频框架。由AWE Core embedded processing engine 和 Audio Weaver Designer IDE 组成。 Audio Weaver Designer 有三个版本,ST Edition, Standard Edtion 和 Pro Edtion。 Audio Weaver Designer界面: Audio Weaver 的整体使用架构: AWD算法流文件,AWS配置脚本文件,AWB嵌入式b

甲客实验室 6881

组合分支预测

这篇文章讨论了几种分支预测的实现方式。

m0_56836274的博客 1560

13-单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊【单片机,物联网,上位机】: 说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系! 说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。 说明3:学会以后,下面的代码可能会跟你一辈子! 说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程! 拷贝这两个文件到自己的工程 ..

杨奉武的博客 1281

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 430

分支预测总结

如果条件指令的条件满足,条件指令被执行。紧跟条件指令后面那些指令被取消。这会在流水线中引入空闲/停顿周期。进而,降低处理器的性能。

m0_73386671的博客 1537

给STM32F4装上耳朵:用麦克风模块和Keil MDK实现你的第一个语音指令(附完整代码)

本文详细介绍了如何使用STM32F4开发板和麦克风模块实现简单的语音指令识别系统。通过Keil MDK开发环境配置、ADC音频采样、语音活动检测和模板匹配算法,开发者可以快速构建响应'开灯'、'关灯'等基础指令的语音交互方案。文章包含完整代码实现和调试技巧,特别适合STM32初学者入门语音识别领域。

weixin_29171087的博客 436

【超标量】分支预测的方向预测总结

静态分支预测与动态分支预测

qq_40807206的博客 3978

嵌入式工程师成长之路(7)——算法学习

算法大全1、风仲达——算法笔记2、坐在马桶上学算法3、啊哈算法4、深度强化学习实验室。

云轩阁 4万+

基于STM32L4XX、HAL库的 ATGM336H GPS定位模块驱动程序设计

/ 转换为km/h。// 定位状态: 0=无效, 1=GPS定位, 2=差分定位。// GPS解析数据。支持GPS/BeiDou/GLONASS/Galileo/QZSS多系统联合定位。// 回调函数(需要在HAL_UART_RxCpltCallback中调用)// 地面速度(km/h)// 海拔高度(m)

zhusl6688的博客 794

分支指令与分支预测

在指令流水线中,在IF取指阶段会将PC值自动加4跳转到当前执行指令的下一条指令处,那么在流水线中会继续向下读取指令,分支指令在MEM段执行 后才能读取到跳转指令的地址,在第一条指令的ID,EX和MEM三个时钟周期中,流水线会顺序向下读取三条指令,但是分支跳转成功时,程序会发生跳转,会停止中间读取的这三条指令的执行,此时就是浪费三个时钟周期。

fencecat的博客 8794

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1111

TAGE分支预测

TAGE分支预测算法

weixin_45171433的博客 2253

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RISC-V 分支预测

分支预测 文章目录分支预测一、分支指令类型二、分支预测1.静态预测(方向)2.0动态预测(方向)2.0.1一级预测器2.0.1两级预测器3.0预测地址3.1 RSIC-V取指简化3.2 RAS依据3.2RIC-V调用约定 一、分支指令类型 1.无条件跳转/分支指令,指无需判断一定会发生跳转的指令。分为以下两种情况: —-无条件直接跳转;指跳转的目标地址从指令编码中的立即数可以直接计算出,RSIC-V中的jal指令便属于无条件直接跳转指令。如下图所示,指令直接跳转到pc=80000132处。 80000

weixin_43403350的博客 5925

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

cpu的分支预测的原理

分支预测是 CPU 为了提升指令执行效率而采用的重要技术,下面为你详细介绍其原理、实现方式和影响。

xiaowenwu66的博客 1969

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分支预测概述

分支预测本身是比较复杂的,不同的处理器有不同的实现方法,它是影响一款处理器性能高低的关键因素之一,需要在处理器设计的时候仔细进行权衡和折中,以便在硬件消耗、预测准确度和延迟(latency)之间找到一个平衡点。要进行分支预测,首先需要知道从I-Cache取出来的指令中,哪条指令是分支指令,这对于每周期取出多条指令的超标量处理器来说,更为不容易,需要从指令组(fetch group)中找出分支指令;执行阶段之前的全部指令都从流水线中清除(flush)对于超标量处理器来说,准确度高的分支预测更为重要;

major的博客 1714

【TAGE】分支预测

文章目录1. GEometric history length prediction2. The TAGE predictor2.1 prediction computation2.2 updating the TAGE predictor2.2.1 更新 useful counter *u*2.2.2 正确预测的更新2.2.3 整体预测错误时2.3 更新策略的原理3. 代码 论文地址:TAGE 1. GEometric history length prediction 预测器有M个不同的预测表 TiT_

Alchemist2002的博客 4904
上一篇: 汇编语言
下一篇: 内存地址转换与分段
ctrloep
博客等级 码龄19年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值