分支预测详解

news2024/11/16 23:58:03

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

目录

分支预测简介

静态分支预测

动态分支预测

启动分支预测


分支预测简介

要了解分支预测器,就不得不提指令流水线。以4级流水线为例,四个步骤分别是取指、解码、执行、写回。如下图所示。

假设一条指令从执行开始到执行结束需要4个时钟周期,在没有流水线的情况下,需要等待第一条指令执行结束,才能取第二条指令,这时两条指令就用了8个周期,效率是很低的。

引入4级流水线将指令拆成4个步骤:取指、解码、执行、写回。当第一条指令处于解码时,同时对第二条指令取指;对第一条指令执行时,同时对第二条指令解码,对第三条指令取指;对第一条指令写回时,同时对第二条执行,第三条解码,第四条取指;如此这般。最终达到的效果就如上图所示,只有第一条指令需要4个周期,其他后续的指令都只需要1个周期,极大地提高了处理效率。

流水线的高效率的前提是指令顺序执行,在执行跳转指令时,流水线将被清空,又回到了上图中的第一步,跳转后的第一条指令要执行仍然需要4周期。因此如果程序频繁跳转,流水线的作用就大打折扣。

为了解决这个问题,就引入了分支预测器:它会提前检测到跳转指令,并根据预判结果取指。如果预判结果是不跳转,就按顺序取下一条指令;如果预判结果是跳转,就从跳转的目的地址取下一条指令。假如预测对了,那么流水线就不会被清空,仍然可以一条指令1个周期;如果预测错了,下一条指令仍然要4周期。从这里看出,分支预测器对于提高流水线效率是有帮助的。当然,以上情况并不适用于所有的内核,预判对错所需要的指令周期还是取决于MCU是如何设计的。

静态分支预测

其实,静态分支预测就是不预测哈哈。常用静态分支预测一般有如下几种:

  1. 总是不跳转:实现简单,无需跳转预测;对于条件分支来说,准确率大概为30%~40%。
  2. 总是跳转:实现简单,无需跳转预测;对于条件分支来说,准确率大概为60%~70%。
  3. BTFN(Backward taken, forward not taken):如果目标地址比当前分支指令PC小,即往前跳,则跳转(如循环);如果目标地址比当前分支指令PC大,即往后跳,则不跳。
  4. Profile based(likely direction):编译器使用profile运行方式确定可能的分支方向,并编码到指令中。
  5. Program based (likely direction):根据ISA指令特定,对不同指令采用不同的预测方向。
  6. Programmer based:程序员提供静态预测,通过编译器指令指示方向。if (likely(x)) {....} 指示较大概率是跳转,if (unlikyly(error)) {....} 指示较大概率是不跳转。

动态分支预测

动态预测则指在程序运行时进行预测。不同的软件、不同的程序分支行为,我们可以采取不同的算法去提高预测的准确率,如我们可以根据程序的历史执行路径信息来预测本次跳转的行为,常见的动态预测方式有1-bit动态预测、n-bit动态预测、下一行预测、双模态预测、局部分支预测、全局分支预测、融合分支预测、循环预测等。随着大量新的应用软件的出现,为了应对新的程序逻辑行为,分支预测器也做得越来越复杂,占用的芯片面积也越来越大。在CPU内部,除了Cache,就数分支预测器的电路版图最大。

举例来说:

  1. Last time prediction(单bit计数器):以上一次的跳转情况作为这一次是否跳转的预测,针对每个分支使用一个bit来记录上一次执行的方向,保存在BTB中,并使用分支指令PC进行索引。
  2. 2bit饱和计数器预测:针对每个分支指令维护一个使用2bit的饱和计数器来对历史状态进行标记,遇到一次跳转则计数器加1,遇到一次不跳转则计数器减一;预测时根据计数器的值来进行预测,预测的映射方法有多种:使用计数器的最高位来预测,即最高位为1则预测跳转,否则预测不跳转;使用计数器的值来预测,计数器非0则预测跳转,否则预测不跳转。相应的预测器结构同前述的单bit预测器类似,差别在于BTB中维护的计数器位宽以及预测的映射方式。

分支预测技术是提高CPU性能的一项关键技术,其本质就是去除指令之间的相关性,让程序更高效运行。一个CPU性能高不高,不仅在于你的流水线有多深、主频有多高、Cache有多大,还和分支预测技术息息相关。一个分支预测器好不好,我们可以从两个方面来衡量:分支判断速度和预测准确率。目前分支预测技术可以达到95%的预测准确率,然而技术进化之路永未停止,分支预测技术一直在随着计算机的发展不断更新迭代。

启动分支预测

对于Cortex-R4、Cortex-R5、Cortex-M7等支预测功能在复位时是自动启用的。不需要软件配置做就能获得最大的性能。如下图所示,内核手册中BP默认使能。

对于Cortex-R7、Cortex-R8等复位时默认不使能分支预测,这意味着软件必须使能分支预测,以获得最大的硬件性能。通过设置Z比特来使能分支预测。Z比特位于系统控制寄存器SCTLR的第11位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT当类有多个不同类型的同名信号时如何处理QOverload?

我们在设计类的信号时也许也会像设计类方法一样,给予多种不同参数类型的重载版本,这样一来我们就可以应对不同类型的参数输入或者输出。 但我们在使用有重载的信号版本时就不那么方便了,QT系统没有那么智能,不会自动匹配&#xff…

【实操案例三】进制转换、异常捕获、输出颜色设置、格式化字符串的设置等实例代码及运行效果图!

任务一:将指定的十进制数转换成二进制、八进制、十六进制 # 任务一:将指定的十进制数转换成二进制、八进制、十六进制 def fun():numint(input(请输入一个十进制整数:))print(num,的二进制数为:,bin(num)) # 第一种写法&#xff…

网线交叉、直连区别

欢迎来到东用知识小课堂!一.网线常识网线常用的有:双绞线、同轴电缆、光纤等。双绞线可按其是否外加金属网丝套的屏蔽层而区分为屏蔽双绞线(STP)和非屏蔽双绞线(UTP)。从性价比和可维护性出发,大…

golang语言websocket百万长链接

是简单demo测试 前端 <html> <head><title>Simple client</title><script type"text/javascript">var ws;function init() {// Connect to Web Socketws new WebSocket("ws://localhost:8866/ws");// Set event handlers…

联合证券|再创纪录,外资狂买超1000亿!券商、期货板块持续活跃

A股今天全线上扬&#xff0c;沪指小幅走高&#xff0c;创业板、科创50指数体现强势&#xff1b;港股走势疲弱&#xff0c;恒生科技指数一度跌超2%。 详细来看&#xff0c;两市股指盘中震动上扬&#xff0c;午后全线走高&#xff0c;创业板指、科创50指数涨超1%&#xff1b;到收…

PCB板缺陷检测识别系统 YOLOv7

PCB板缺陷检测识别系统通过YOLOv7网络深度学习技术&#xff0c;对现场PCB是否存在缺陷部分进行实时分析检测&#xff0c;当检测到PCB本身存在缺陷的时候&#xff0c;立即抓拍存档告警方便后期针对性的进行调整改。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其…

CSS+JS 折叠

文章目录CSSJS 折叠效果CSSjQuery 鼠标经过显示详细信息CSSJS 折叠效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>折叠效果</title><style type"text/css">.collapse-box {width: 500px;borde…

FMC子卡设计资料原理图:FMC177-基于AD9361的双收双发射频FMC子卡

FMC177-基于AD9361的双收双发射频FMC子卡一、板卡介绍 FMC177射频模块分别包含两个接收通道与发射通道&#xff0c;其频率可覆盖达到70MHz~6GHz&#xff0c;AD9361芯片提供具有成本效益的实验平台&#xff0c;具有达到56MHz的瞬时带宽&#xff0c;更高的灵敏度&#xff…

Java 23种设计模式(2.创建者模式-单例设计模式)

1. 创建者模式 创建型模式分为&#xff1a; 单例模式工厂方法模式抽象工程模式原型模式建造者模式 什么是创建者模式&#xff1f; 创建型模式的主要关注点是“怎样创建对象&#xff1f;”&#xff0c;它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度…

Windows 下 VS Code 远程连接 Ubuntu 并配置免密登录

文章目录1.安装 Visual Studio Code2.安装必要的插件3.为本机生成 SSH 密钥对4.将公钥拷贝到 Ubuntu 上5.配置 Remote 插件6.关闭远程连接7.卸载 Visual Studio Code7.1 在控制面板中找到 Visual Studio Code 将其卸载7.2 删除之前安装过的插件7.3 删除用户信息和缓存信息1.安装…

BootStrap使用笔记+案例

前端开发 第三节BootStrap BootStrap BootStrap是别人写好的CSS样式&#xff0c;如何使用BootStrap&#xff1a; 下载BootStrap使用 在页面上引入BootStrap编写HTML时&#xff0c;按照BootStrap的规定来编写 自定制 开发版本&#xff1a;bootstrap.css 生产版本&#xf…

【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

在线支付系列【2】支付宝和微信支付发展史

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录支付宝发展史起步阶段发展阶段上升阶段微信支付发展史支付宝 支付宝是阿里巴巴集团于 2004 年推出的一款第三方支付的产品&#xff0c;目前隶属于蚂蚁金服&#xff08;杭州&#xff09;网络技术…

2023年最推荐苹果、华为、荣耀:一场“以人为中心”的口碑竞技

消费者需求是市场发展的风向标。经济学界早有洞察&#xff0c;诺贝尔经济学奖得主哈耶克曾提出“消费者主权”理论&#xff0c;认为生产什么&#xff0c;生产多少&#xff0c;应当由消费者的意愿和偏好决定。手机市场也是如此&#xff0c;存量竞争下&#xff0c;消费者进一步掌…

软件测试复习09:集成测试、系统测试、验收测试、回归测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录集成测试集成测试方法自顶向下自底向上系统测试验收测试回归测试集成测试 把模块拼装到一起&#…

【电力系统经济调度】多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现】

目录 0 概述 1 环境经济调度数学模型 2 多元宇宙算法 3 运行结果 4 Matlab代码实现 目录 0 概述 1 环境经济调度数学模型 2 多元宇宙算法 3 Matlab代码实现 3.1 主函数&#xff1a; 3.2 目标函数 4 运行结果 0 概述 多元宇宙算法求解电力系统多目标优化算法有…

【GD32F427开发板试用】CAN总线了解和回环测试

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;HonestQiao CAN总线是个好东西&#xff0c;据说用了的都说好。只要是09年之后的车都有CAN总线&#xff0c;要是摸得透的话&#xff0c;你还能通…

微信小程序开发尚学堂 介绍 项目结构 组件

一、微信小程序介绍1. 微信小程序介绍微信小程序&#xff0c;简称小程序&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用”触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。说明&#xff1a;小程序是需要下载的&#xff0c;小程序的占用…

用于多核DSP开发的核间通信

TI的多核DSP以TMS320C6678为例&#xff0c;它是多核同构的处理器&#xff0c;内部是8个相同的C66x CorePac。对其中任意一个核的开发就和单核DSP开发的流程是类似的。   但是如果仅仅只是每个核独立开发&#xff0c;那么很难体现出多核的优势。要充分发挥多核处理器的性能&am…

Docker 应用实践-容器篇

在 Docker 镜像篇中&#xff0c;我们了解到 Docker 镜像类似于模板&#xff0c;那么 Docker 容器就相当于从模板复制过来运行时的实例&#xff0c;Docker 容器可以被创建、复制、暂停和删除等。 每一个 Docker 容器在运行时都是以镜像为基础层&#xff0c;并在镜像的基础上创建…