计算机体系结构基础知识介绍之高级分支预测(一)

news2024/11/17 15:48:47

由于需要通过分支危险和停顿来强制控制依赖,分支会损害管道性能。 循环展开是减少分支危险数量的一种方法; 我们还可以通过预测分支的行为来减少分支的性能损失。

分支预测是一种计算机技术,它的目的是在执行分支指令之前,预测分支的方向和目标地址,从而减少流水线的停顿和冲突,提高处理器的性能。

使用分支预测的原因是因为分支指令会中断指令流,导致处理器无法连续地取指和执行。如果处理器不做任何预测,就要等待分支指令执行完毕后才能确定下一条指令的地址,这样会造成很大的时间开销。

分支预测的方法有很多种,可以分为静态预测和动态预测。静态预测是在编译时或者硬件设计时就确定好的预测策略,比如总是预测跳转或者不跳转,或者根据分支指令的方向来预测。动态预测是根据运行时的历史信息来进行预测,比如根据最后一次分支结果来预测,或者使用两位饱和计数器来记录分支的状态。

分支预测的准确率对处理器性能有很大影响,如果预测错误,就要撤销错误的指令,并重新从正确的地址取指,这样会造成流水线的延迟和资源的浪费。因此,分支预测需要尽可能地提高准确率,同时也要考虑硬件复杂度和存储开销。

 一、关联分支预测器

关联分支预测器是一种动态分支预测器,它可以根据前面的分支行为来选择不同的预测器。

关联分支预测器的一种形式是(m,n)预测器,它表示使用最近m个分支行为,从2^m个分支预测中进行选择,每一个预测是对应于单个分支的n位预测器。

例如,一个(2,2)预测器使用最近两个分支行为,从00、01、10、11四种可能的结果组合中选择一个,每一个结果对应一个2位饱和计数器。

关联分支预测器的优点是可以根据不同的分支模式来调整预测策略,提高准确率。

关联分支预测器的缺点是需要更多的硬件资源和存储空间,以及更复杂的索引和比较逻辑。

如果我们还查看其他分支的最近行为而不仅仅是我们试图预测的分支,则可能会提高预测准确性。 考虑 eqntott 基准测试中的一个小代码片段,该基准测试是早期 SPEC 基准测试套件的成员,它显示出特别糟糕的分支预测行为:

 

以下是我们通常为此代码片段生成的 RISC-V 代码,假设将 aa 和 bb 分配给寄存器 x1 和 x2:

我们将这些分支标记为 b1、b2 和 b3。 关键的观察结果是分支 b3 的行为与分支 b1 和 b2 的行为相关。 显然,如果分支 b1 和 b2 都不被采用(即,如果条件都计算为 true 并且 aa 和 bb 都被赋值为 0),则将采用 b3,因为 aa 和 bb 显然相等。 

使用其他分支的行为进行预测的分支预测器称为相关预测器或两级预测器。 现有的相关预测器添加有关最新分支行为的信息,以决定如何预测给定分支。 

最近m个分支的全局历史可以用一个m位的移位寄存器来记录,每一位记录分支是跳转还是不跳转。分支预测缓冲区可以用分支地址的低位和m位全局历史的拼接来索引。例如,在一个(2,2)缓冲区中,有64个总条目,分支的4个低位地址(字地址)和2个全局位表示最近执行的两个分支的行为,形成一个6位的索引,可以用来索引64个计数器。通过拼接(或者一个简单的哈希函数)来结合局部和全局信息,我们可以用结果来索引预测器表,并且得到一个预测,这个预测和标准的2位预测器一样快。

二、锦标赛预测器

锦标赛预测器是一种动态分支预测器,它的基本原理是将两个或以上的分支预测方法进行结合,充分发挥各预测方法的优势,以进一步提高分支预测的准确度。

锦标赛预测器通常包含一个全局预测器、一个局部预测器和一个选择器。全局预测器使用全局历史寄存器来记录所有分支指令的历史行为,局部预测器使用局部历史表来记录每个分支指令的历史行为,选择器使用选择历史表来记录哪个预测器的结果更准确。

预测时,全局预测器和局部预测器同时进行预测,并将结果传递给选择器。选择器根据选择历史表中的状态来选择其中一个预测结果作为最终的预测结果。

更新时,全局预测器和局部预测器根据分支指令的实际跳转行为和自身的更新策略进行更新。选择器根据全局预测器和局部预测器的正确性来更新选择历史表中的状态。

锦标赛预测器的优点是可以根据不同的分支模式和关联性来动态调整预测策略,提高准确率和适应性。

锦标赛预测器的缺点是需要更多的硬件资源和存储空间,以及更复杂的逻辑和控制。

 关联分支预测器的主要动机来自于观察到仅使用局部信息的标准 2 位预测器在一些重要分支上失败。 添加全球历史可能有助于纠正这种情况。 锦标赛预测器将这种洞察力提升到了一个新的水平,通过使用多个预测器(通常是全局预测器和局部预测器),并使用选择器在它们之间进行选择,

锦标赛预测器使用分支地址来索引一组 2 位选择计数器,该计数器在本地预测器和全局预测器之间进行选择。 在这种情况下,选择器表的索引是当前分支地址。 这两个表也是 2 位预测器,分别由全局历史记录和分支地址索引。 选择器的作用类似于 2 位预测器,当连续发生两个错误预测时,更改分支地址的首选预测器。 用于索引选择器表和局部预测器表的分支地址的位数等于用于索引全局预测表的全局分支历史的长度。 

SPEC89 上三种不同预测器的错误预测率与预测器大小(以千位为单位)的关系。 预测器是一个局部 2 位预测器、一个在图中每个点使用全局和局部信息进行优化构造的相关预测器以及一个锦标赛预测器。 尽管这些数据适用于旧版本的 SPEC,但最新 SPEC 基准测试的数据显示出类似的行为,可能会在预测变量大小稍大的情况下收敛到渐近极限。 

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

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

相关文章

人工智能三要素:算法、算力、数据

1 人工智能介绍 人工智能(Artificial Intelligence,简称AI)是指计算机系统模拟、模仿和执行人类智能的能力。它是一门研究如何使计算机能够像人类一样思考、学习、推理和解决问题的科学和技术领域。 人工智能通过利用大量的数据和强大的计算…

ACL访问控制、Squid 反向代理

ACL访问控制、Squid 反向代理 一、ACL访问控制1、定义访问控制列表2、配置步骤 二、Squid 反向代理1、工作机制2、配置步骤 一、ACL访问控制 在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现: (1)使用 acl 配置项定…

【我们一起60天准备考研算法面试(大全)-第八天 8/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

路径规划算法:基于混沌博弈优化的路径规划算法- 附代码

路径规划算法:基于混沌博弈优化的路径规划算法- 附代码 文章目录 路径规划算法:基于混沌博弈优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

Vue3的使用--002

Vue3包含vue2的语法,学习vue3就行。 前提要求, 安装大于node.js15.0。 创建Vue 项目 : npm init Vuelastest : 这一执行将会安装并执行create-vue, 他是Vue 官方的脚手架工具。你将会看到一些Typescript 和测试支持之类的可选功能提示&…

在VSCode里使用Jupyter?Notebook调试Java代码的详细过程

目录 什么是Jupyter Notebook?Jupyter Notebook主要优点环境准备下载 IJava创建conda虚拟环境搭建运行环境测试 之前使用的那台电脑有点旧了,稍微跑一下程序就报内存不够。本来想考虑入手一台带GPU的新电脑,在商品浏览里的时候,…

DynaSLAM代码详解(1) — RGBD模式DynaSLAM运行流程

目录 1.1 DynaSLAM和ORB-SLAM2文件对比 1.2 RGBD模式运行流程 论文翻译地址:动态SLAM论文(2) — DynaSLAM: Tracking, Mapping and Inpainting in Dynamic Scenes_几度春风里的博客-CSDN博客 1.1 DynaSLAM和ORB-SLAM2文件对比 DynaSLAM是一个建立在ORB-SLAM2基础上…

【Leetcode】707. 设计链表

单向链表 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self):self.dummy_head ListNode()self.size 0def get(self, index):if index < 0 or index > self.size:return -1current self.dummy_h…

【简单认识LVS+Keepalived负载均衡高可用群集】

文章目录 一、Keepalived高可用详解1、简介2、原理3、Keepalived体系主要模块及其作用&#xff1a; 二、LVSKeepalived 高可用群集部署实例1.配置NFS共享存储器2.配置节点web服务&#xff08;两台的配置相同&#xff09;&#xff08;1&#xff09;配置虚拟 IP 地址&#xff08;…

飞桨黑客松 OpenVINO™ 任务获奖者经验分享 | 基于OpenVINO™ 与PaddleOCR的结构化输出Pipeline...

点击蓝字 关注我们,让开发变得更有趣 作者 | 张一乔 排版 | 李擎 OpenVINO™ 1. 黑客松活动介绍 01 第四季飞桨黑客松(PaddlePaddle Hackathon Season 4)是由百度联合合作伙伴共同举办的开源深度学习框架类黑客松活动。本次活动旨在为全球开发者提供一个交流、合作和创新的机会…

Django_模型类详解(七)

目录 一、定义属性 字段类型 选项 二、查询集 两大特性 查询集的缓存 限制查询集 三、条件查询 条件运算符 1) 查询相等 2) 模糊查询 3) 空查询 4) 范围查询 5) 比较查询 6) 日期查询 F对象 Q对象 聚合函数 四、关联查询 通过对象执行关联查询 通过模型类执…

线程池介绍

1、什么是线程池 例子&#xff1a; 10年前单核CPU电脑&#xff0c;假的多线程&#xff0c;像马戏团小丑玩多个球&#xff0c;CPU需要来回切换。 现在是多核电脑&#xff0c;多个线程各自跑在独立的CPU上&#xff0c;不用切换效率高。 线程池的优势&#xff1a; 线程池做的工作…

七、VPN技术之密码学基础(密码体制、对称加密算法、非对称加密算法)

更多网络基础内容可见: 网络基础学习目录及各章节指引 7.1 密码学基础 7.1.1 基础概念 密码:对文本进行编码,使偷窥者无法识别的算法。是一套编码方案,一种特殊的报文编码和相应的解码方式的结合体。 加密之前的原始报文称为明文,使用密码之后的报文叫密文。一个简单的例…

elk高并发架构

1.前言 普通的elk架构只适合数据量小的情景&#xff0c;而且也不安全&#xff0c;在瞬时数据量大的情况下可能会导致logstash崩溃&#xff0c;从而导致数据的丢失&#xff0c;对于数据安全有较高要求&#xff0c;可以在架构中加入消息队列&#xff0c;既可以防止瞬时的大流量并…

有过JVM调优经验吗【面试题】

写作目的 JVM其实比较偏理论的&#xff0c;日常工作中很少遇到。但是面试他问&#xff0c;所以需要自己mock一下场景进行准备这个问题的回复。 本次分析的场景的元空间太小导致频繁FGC的问题。 源码&启动参数 gitee下载源码 启动-调优前 nohup java -XX:MetaspaceS…

【MySQL】SQL索引失效的几种场景及优化

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法&#xff0c;并且加快查询的速度&#xff0c; 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速度&#xff0c;…

C++之函数模板高级用法(一百五十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

两个好用到爆的Python模块,建议收藏!

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

基于单片机的智能鞋柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过DHT11温湿度采集&#xff1b;通过按键设置逻辑处理&#xff1b;通过LED紫外线消毒&#xff1b;通过继电器控制风扇进行换气除湿&#xff1b;通过继电器控制加热片进行加热&#xff1b;整个电路以5v供电; 电路图 PCB 源代码 #i…

nodejs 读取xlsx 文件转json 格式(包含表格时间类型)

需求概要&#xff1a;从xlsx 文件中读取内容转化成想要的json 格式&#xff0c;用于web 读取数据 newDoc.xlsx文档内容大概&#xff1a; 本内容主要是更新前端公告内容&#xff0c; const xlsx require(node-xlsx) const fs require(fs) const moment require(moment)//转换…