CPU设计-分支预测

2023-05-16

目录

CPU分支指令类型分类

1 )无条件跳转/分支( Unconditional Jump/Branch )指令

无条件直接跳转/分支:

无条件间接跳转/分支:

2 )带条件跳转/分支( Condinal Jump/Branch )指令

带条件直接跳转/分支:

带条件间接跳转/分支:

分支预测:

一、预测方向。可以分为静态预测和动态预测两种

1)静态预测

2)动态预测

一级预测器

两级预测器

二、预测地址

1) BTB

2) RAS

3) Indirect BTB


CPU分支指令类型分类

1 )无条件跳转/分支( Unconditional Jump/Branch )指令

无需条件一定会发生跳转的指令,根据跳转目标地址计算方式不同可分为两类

无条件直接跳转/分支

即跳转的目标地址从指令编码中的立即数可以直接计算而得。

无条件间接跳转/分支:

即跳转目标地址需要寄存器索引的操作数中计算得到

2 )带条件跳转/分支( Condinal Jump/Branch )指令

根据判断条件而决定是否发生跳转的指令,根据跳转目标地址计算方式不同也可分为两类:

带条件直接跳转/分支:

指目的地址从指令编码中的立即数可以直接计算而得。

带条件间接跳转/分支:

即跳转目标地址需要寄存器索引的操作数中计算得到


对于带条件跳转/分支指令,流水线在取指令阶段无法得知该指令是否成立,理论上指令只有在执行阶段完成之后,才能够解析出最终的跳转结果。假设处理器将取指暂停, 一直等到执行阶段完成才继续取指,则会造成大量的流水线空泡周期,从而影响性能。 为了提高性能,现代处理器的取指单元一般会采用分支预测( Branch Prediction )技术。


分支预测

一、预测方向。可以分为静态预测和动态预测两种

1)静态预测

静态预测不依赖于任何曾经执行过的指令信息和历史信息,仅依靠这条分支指令本身的信息进行预测。
a)简单的静态预测方法是总预测分支指令不会发生跳转,因此取指单元便总是顺取分支指令的下一条指令。待执行阶段之后如果发现需要跳转 ,则会冲刷流水线(Flush Pip line )重新进行取指。
b)BTFN 预测(Back Taken, Forward Not Taken ),即预测向后则跳转,向前则不跳转,比较目标PC值与当前分支指令PC值的大小来进行跳转与否的操作

2)动态预测

动态预测依赖已经执行过的指令的历史信息和分支指令本身的信息综合进行”方向“的预测
a)一比特饱和计数器。每次分支指令执行之后,便使用此计数器记录上次的“方向” 其预测机制是:下次分支指令永远采用上次记录的“方向”作为本次的预测 这种预测器结构最简单,但是预测精度不如两比特饱和计数器
b)“两比特饱和计数器。总共有四个状态,“强不需要跳转,强需要跳转,弱不需要跳转,弱需要跳转”其状态跳转如下图 
当为强/弱不需要跳转时,则预测不跳转,当为强/弱需要跳转时,则预测需要跳转。每次预测出错之后便会向着相反的方向更改状态机状态,譬如当前状态为“强需要跳转”,会预测为需要跳转,但是实际结果是不需要跳转,则需要将状态机的状态更新为弱不需要跳转。
“两比特饱和计数器”对于预测一条分支指令很有效,但是处理器执行的指令流中存在着众多的不同分支指令(位于不同的 PC 值位置) 假设只使用一个“两比特饱和计数 器”在任何分支指令执行时均进行更新,那么必然会互相冲击,预测的结果会很不理想目前一般通过采用不同的表格组织方式(控制表格的大小)和索引方式(控制别名重合问题〉,来提供更高的预测精准率。

一级预测器

将有限个“两比特饱和计数器”组织成一维的表格,称为预测器表格( Predictor Table ),并直接使用 PC 值的 部分进行索引。譬如使用 PC 的后10 位作为索引,则仅要维护1000 表项的表格。
但一级预测起很多不同的分支指令都会指向同样的表项,并且由于没有考虑到分支指令的上下文执行历史,分支预测的精度不高

两级预测器

对于每条分支指令而言,将有限个“两比特饱和计数器”组织成 PHT ( Pattern History Tab)用该分支跳转的历史( Branch History )作为 PHT 的索引。假设用 n 个比特记录其历史 ( taken 或 not taken ),则可以索引 2的 n 次方个表项
分支历史( Branch History )又可以分为局部历史全局历史 。局部历史是指每个分支指令自己的分支跳转历史,而全局历史是指所有分支指令 的分支跳转历史
分支预测器(Branch Predictor )又分为局部分支预测器全局分支预测器。局部分支预测器(Local Branch Predictor )会使用分立的局部历史来保存不同指令的分支历史,每个局部历史缓存有自己对应的 PHT;全局分支预测器( Global Branch Predictor )则仅使用所有分支指令共享的全局历史缓存,全局分支预测器的 个很明显的弊端是它无法区分单独每个分支指令的历史,不同的指令会互相冲击,但是它的优势是比较节省资源。

二、预测地址

对于间接跳分支指令,由于分支目标地址需要使用寄存器索引的操作数(基地址寄存器)和指令字中的立即数进行加法运算,只能在流水线的执行阶段才计算出分支目标地址,这需要多个时钟周期才能完成,为了连续不断地取值,则需预测分支目标的地址。

1) BTB

分支目标缓存 (Branch Target Buffer, BTB )技术是指使用容量有限的缓存保存最近执行过的分支指 PC 值,以及它们的跳转目标地址。对于后续 要取指的每条PC值,将其与BTB中存储的各个 PC 值进行比较,如果出现匹配,则预测这是分支指令,并使用其对应存储的跳转目标地址作为预测的跳转地址。

2) RAS

返回地址堆枝( Return Address Stack, RAS )技术是指使用容 有限的硬件堆枝来存储函数调用的返回地址。只要程序是在正常执行,其函数的调用和返回成对出现,那么RAS便能够提供较高的预测准确率。不过由于RAS的深度有限,如果程序中出现很多次函数嵌套,需要不断地压入堆枝,造成堆枝溢出,则会影响到预测准确率。

3) Indirect BTB

间接BTB (indirect BTB )是指专门为间接跳转 分支 Cindirect Jump/Branch )指令而设计的BTB ,它与普通BTB类似,存储较多历史目标地址,但是通过高级的索引方式,结合了 BTB 和动态两级预测器的技术,能够提供较高跳转目标地址预测成功率但其缺点是硬件开销非常大,只有在高级的处理器中才会使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU设计-分支预测 的相关文章

  • 内存存取区——堆和栈

    一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量的值等 其操作方式类似于数据
  • ROS中RVIZ坐标系及TF坐标系转换

    RVIZ坐标系 X轴 红色 Y轴 绿色 Z轴 蓝色 YAW 偏航角 绕Z轴旋转 PITCH 俯仰角 绕Y轴旋转 ROLL 滚转角 绕X轴旋转 符合右手坐标系原则 利用TF进行坐标系转换 采用以下指令进行转换 xff0c 其中frame id
  • 【C语言】长度为0的数组

    最近在看代码的时候发现一个好玩的事情 xff0c 长度为0的数组 xff0c 在此记录一下 在网上看到的这个说是只有GNU C才支持的特性 xff0c 因此考虑跨平台或者可移植特点需要慎用 话不多说 xff0c 上案例才有感觉 span c
  • jetson xavier nx使用usb线刷机后开机黑屏闪屏

    情况一 比较常见 xff09 由于刷机是的flash接口是调在右边的 xff0c 如下图所示 解决方法 xff1a 故在刷机成功后 xff0c 连接显示屏后要将flash接口调到 左侧 情况二 在对jetson xavier nxs进行刷机
  • python牛客网输入输出处理

    python 笔试输入 sys stdin readline和input 非常有用 xff01 xff01 xff09 https www jianshu com p 6f14ca3290ee input vs sys stdin read
  • Demo-简单使用libcurl静态库访问网址

    在开始前请先准备好下面的文件 xff1a 1 调试版的libcurl静态库libcurld lib xff0c 可以在网上下载或自己编译 xff1b 2 头文件 xff0c curl h curlver h easy h mprintf h
  • QQ 浏览器(iOS版)崩溃信息研究

    今天碰巧下载了QQ浏览器iOS版本 xff0c 居然一启动就挂了 后来从手机里面把崩溃信息导出来 xff0c 仔细研究下 xff0c 把研究的结果放到网上 xff0c 与大家分享下 先把我导出的崩溃信息放出来 Incident Identi
  • EXCEL利用VBA自由控制图表绘图区大小

    用好VBA的话确实可以给你再办公室的工作效率带来质的提升 如果有人跟你说你可以用Python什么的语言处理Excel balabala的 xff0c 你可以无视他了 当然python可以处理很多事情 xff0c 但是EXCEL自带的作图工具
  • 提升CUDA程序运行效率的几个关键点

    目录 1 明确计算机中GPU卡片的计算资源 xff0c 决定变量的性质 xff08 constant xff0c share还是global xff09 以及Grid xff0c Block的维度 xff0c 充分并合理利用GPU显卡的资源
  • CUDA程序编写具体参数设置

    介绍了GPU的结构以及资源的控制要素 xff08 GPU硬件结构和程序具体参数设置 yu132563的专栏 CSDN博客 xff09 以及编程过程中的一些需要注意的问题 xff08 CUDA程序性能调优 yu132563的专栏 CSDN博客
  • CUDA Stream流并发性

    目录 1 CUDA 中的异步命令 2 默认流 3 Multistream多流示例 异构计算是指高效地使用系统中的所有处理器 xff0c 包括 CPU 和 GPU 为此 xff0c 应用程序必须在多个处理器上并发执行函数 CUDA 应用程序通
  • Madagascar环境下编程

    引用 原创 Madagascar环境下编程 2013 07 17 04 50 34 转载 标签 xff1a 教育 分类 xff1a madagascar 本文转载自seismig 原创 Madagascar环境下编程 Madagascar是
  • mySQL(关系型数据库管理系统)编辑

    收藏 2906 1034 mySQL xff08 关系型数据库管理系统 xff09 编辑 MySQL 1 是一个 关系型数据库管理系统 xff0c 由瑞典 MySQL AB公司开发 xff0c 目前属于 Oracle公司 MySQL是最流行
  • CPU的核心数、线程数的关系和区别

    我们在选购电脑的时候 xff0c CPU是一个需要考虑到核心因素 xff0c 因为它决定了电脑的性能等级 CPU从早期的单核 xff0c 发展到现在的双核 xff0c 多核 CPU除了核心数之外 xff0c 还有线程数之说 xff0c 下面
  • STM32单片机,下载器下载完程序能正常跑起来,断电再上电程序不运行

    晶振坏了 转载于 https www cnblogs com god of death p 7050281 html
  • CUDA性能优化----warp深度解析

    CUDA性能优化 warp深度解析 2017 01 12 16 41 07 分类 xff1a HPC amp CUDA优化 标签 xff1a gpu cuda hpc 举报 字号 订阅 下载LOFTER 我的照片书 1 引言 CUDA性能优
  • 螺旋桨转矩

    xfeff xfeff 在螺旋桨气动力分析时 xff0c 首先应用翼型理论进行螺旋桨叶素分析 利用翼型升阻特性数据 xff0c 回避了有限机翼的展弦比问题 xff0c 诱导流动由涡流模型确定 xff0c 取决于桨叶数目 间距以及作用于每片桨
  • 给初学者们讲解人工神经网络(ANN)

    1 介绍 这份教学包是针对那些对人工神经网络 xff08 ANN xff09 没有接触过 基本上完全不懂的一批人做的一个简短入门级的介绍 我们首先简要的引入网络模型 xff0c 然后才开始讲解ANN的相关术语 作为一个应用的案例 xff0c
  • OpenMP基本概念

    OpenMP是一种用于共享内存并行系统的多线程程序设计方案 xff0c 支持的编程语言包括C C 43 43 和Fortran OpenMP提供了对并行算法的高层抽象描述 xff0c 特别适合在多核CPU机器上的并行程序设计 编译器根据程序
  • 散度和旋度的物理意义是什么?

    高等数学学的时间有点久远了 xff0c 最近需要推倒一些公式 xff0c 以前高数学的时候这公式那定理的都没说什么物理意义 xff0c 现在接触的问题都是具有一定物理意义的 xff0c 感觉对不上 xff0c 回来找找资料好好理解一下 xf

随机推荐

  • 格林公式、高斯公式及斯托克斯公式的理解及相互关系

    最近要推倒波动方程积分解 xff0c 要对散度 旋度以及他们之间的相互关系有一个理解 看了两天 xff0c 自己认为理解的差不多了 xff0c 现在写在这个地方 xff0c 作为笔记 xff0c 以后忘记了拿过来看一下 xff0c 加深一下
  • Radon变换理论介绍

    本人最近在研究Radon变换 xff0c 在查阅了各种资料之后在此写下个人的理解 xff0c 希望与各位牛牛进行交流共同进步 xff0c 也使得理解更加深刻些 Radon变换的本质是将原来的函数做了一个空间转换 xff0c 即 xff0c
  • test

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 utf 8 34 gt lt meta http equiv 61 34 X U
  • BIT内存顺序

    机器的最小寻址单位是字节 xff0c bit无法寻址 xff0c 也就没有高低地址和起始地址的概念 xff0c 我们需要定义一下bit的 地址 以一个字节为例 xff0c 我们把从左到右的8个bit的位置 position 命名按顺序命名如
  • 无人驾驶感知篇之融合(五)

    今天早上看到上海新增一万七千左右 xff0c 看的真的很揪心 xff01 希望白衣战士能早点战胜这场疫情 xff0c 期待明天能有好消息 xff01 今天具体讲讲多贝叶斯估计算法的原理 xff0c 多贝叶斯估计法的主要思想是将传感器信息依据
  • MAC地址的介绍(单播、广播、组播、数据收发)

    MAC地址组成 网络设备的MAC地址是全球唯一的 MAC地址长度为48比特 xff0c 通常用十六进制表示 MAC地址包含两部分 xff1a 前24比特是组织唯一标识符 xff08 OUI xff0c OrganizationallyUni
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • Linux内核Socket CAN中文文档

    自己在年假中空闲之余翻译的内核中Socket CAN的文档 xff0c 原文地址在 xff1a http lxr linux no linux 43 v2 6 34 Documentation networking can txt 但是这篇
  • c/c++自定义通讯协议(TCP/UDP)

    前言 xff1a TCP与UDP是大家耳熟能详的两种传输层通信协议 xff0c 本质区别在于传输控制策略不相同 xff1a 使用TCP协议 xff0c 可以保证传输层数据包能够有序地被接受方接收到 xff0c 依赖其内部一系列复杂的机制 x
  • ubuntu 使用虚拟can 与 socketCAN使用

    原文链接 xff1a https blog csdn net xiandang8023 article details 127990159 创建虚拟CAN接口 在Linux上能使用虚拟CAN接口之前 xff0c 需要在终端执行以下三个步骤
  • cmake引入第三方库

    cmake引入第三方库 第三方库包含 lib文件和 h hpp文件动态库还包含 dll文件 小例程 3rdparty bin test dll include test hpp lib Debug test lib Release test
  • AHB-APB总线协议

    AHB APB总线协议 文章目录 AHB APB总线协议一 AHB APB总线介绍二 AHB总线设备1 AHB主设备 xff08 master xff09 2 AHB从设备 xff08 slave xff09 3 AHB仲裁器 xff08
  • Modelsim缺失库快速添加

    Modelsim缺失库快速添加 文章目录 Modelsim缺失库快速添加前言一 ini文件二 器件库配置1 将器件库放在modelsim文件夹下2 ini配置文件修改 前言 在单独使用modelsim时 xff0c 假如要编译复杂的工程文件
  • AHB-APB_Lite总线协议及Verilog实现

    AHB APB Lite总线协议及Verilog实现 文章目录 AHB APB Lite总线协议及Verilog实现一 AHB Lite协议介绍二 系统框架介绍三 代码设计四 仿真测试 一 AHB Lite协议介绍 AHB xff08 Ad
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • Qt error ------ 'XXX' has not been declared

    1 头文件没加 2 调用函数者的头文件在XXX头文件的下方 转载于 https www cnblogs com god of death p 8572306 html
  • Command Expert安装

    一 安装准备 需先下载两个安装包 1 Commmand Expert安装包 https www keysight com cn zh lib software detail computer software command expert
  • Vitis开发(一):Vivado启动vitis

    Vitis是Xilinx SDK的继承开发工具 xff0c 从Vivado 2019 2版本开始启用 在Vivado 2019 1及更早版本中 xff0c 导出的硬件描述文件为 hdf文件 xff0c 给xilinx sdk使用 在Viva
  • 数字IC刷题(一)

    一 选择 1 To achieve better leakage cells are placed A HVT B LVT C RVT 解 LVT Low V threshold xff1a 低阈值 这种库的漏电流较大 xff0c 但是延迟
  • CPU设计-分支预测

    目录 CPU分支指令类型分类 1 xff09 无条件跳转 xff0f 分支 xff08 Unconditional Jump Branch xff09 指令 无条件直接跳转 xff0f 分支 xff1a 无条件间接跳转 xff0f 分支 x