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

news2024/12/29 3:54:07

一、标记混合预测器

分支预测的目的是根据历史信息来预测分支指令的跳转方向和目标地址,从而提高流水线的效率。不同的分支预测方法有不同的优缺点,因此有人提出了一种将多种预测方法结合起来的方案,混合预测器。这种方案可以根据不同的分支情况选择最合适的预测方法,提高预测的准确性。

其中一种重要的混合预测器是基于一种统计压缩算法PPM(Prediction by Partial Matching)的思想,叫做带标签的混合预测器(Tagged Hybrid Predictor)。这种预测器使用了一系列的全局预测器,每个全局预测器使用不同长度的历史信息来索引。例如,一个五部分的带标签混合预测器有五个预测表:P(0),P(1),…,P(4),其中P(i)使用分支指令的地址和最近i条分支指令的历史(保存在一个移位寄存器h中,就像gshare一样)进行哈希运算来索引。使用多个历史长度来索引不同的预测器是第一个关键的区别。

第二个关键的区别是在表P(1)到P(4)中使用了标签。标签可以很短,因为不需要100%匹配:一个4-8位的小标签就可以获得大部分优势。一个来自P(1),…,P(4)的预测只有在标签和分支地址和全局分支历史的哈希值匹配时才会被使用。P(0)总是匹配,因为它不使用标签,它成为了如果没有P(1)到P(n)匹配时的默认预测。每个P(0…n)中的预测器可以是一个标准的2位预测器。

给定分支指令的预测是具有最长分支历史并且也有匹配标签的预测器。带标签混合版本的这个预测器还包括了一个2位使用域,在历史索引预测器中的每一个。使用域表示一个预测是否最近被使用并且因此可能更准确;使用域可以周期性地在所有条目中重置,以便清除旧的预测。实现这种风格的预测器涉及许多更多细节,特别是如何处理错误预测。最优化预测器的搜索空间也非常大,因为预测器数量、用于索引的确切历史和每个预测器大小都是可变化的。

带标签混合预测器(有时称为TAGE——TAgged GEometric predictors)和早期基于PPM的预测器已经成为最近年度国际分支预测竞赛中获胜者。这样的预测器以适度数量(32-64 KiB)内存超越了gshare和锦标赛式(tournament) 预测器,并且此外,这类预测器似乎能够有效地利用更大规模的缓存来提供改进后准确性。

标记混合与 gshare 的误预测率(以每执行 1000 条指令的误预测来衡量)的比较。 两个预测器使用相同的总位数,尽管标记混合使用一些标签存储,而 gshare 不包含标签。 这些基准测试由 SPECfp 和 SPECint(一系列多媒体和服务器基准测试)的跟踪组成。 后两者的行为更像 SPECint。

二、英特尔酷睿 i7 分支预测器的演变 

2008 年(使用 Nehalem 微架构的 Core i7 920)到 2016 年(使用 Skylake 微架构的 Core i7 6700)期间,Intel Core i7 处理器已经出现了六代。 由于深度流水线和每个时钟多个问题的结合,i7 一次有许多指令在运行(最多 256 条,通常至少 30 条)。 这使得分支预测变得至关重要,这也是英特尔一直在不断改进的领域。 也许是因为分支预测器对性能至关重要的性质,英特尔倾向于对其分支预测器的细节保密。

Core i7 920使用了二级预测器,其中一个较小的第一级预测器旨在满足每个时钟周期预测一个分支的周期约束,并有一个较大的第二级预测器作为备份。 每个预测器结合了三个不同的预测器:(1)简单的2位预测器,; (2)全球历史预测器; (3)循环退出预测器。 循环退出预测器使用计数器来预测被检测为循环分支的分支所采用的分支的确切数量(即循环迭代的数量)。 对于每个分支,通过跟踪每个预测的准确性从三个预测器中选择最佳预测,就像锦标赛预测器一样。 除了这个多级主预测器之外,还使用单独的单元预测间接分支的目标地址,并且还使用堆栈来预测返回地址。

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

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

相关文章

适合Docker的场景以及不适合的场景

文章来自:When to use and when not to use Docker和7 Cases When You Should Not Use Docker,以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解,进行简单的概述。 适合的场景 你的团队不是一成不变的。 当有新的成员加入&#…

写作技巧:如何让你的文章充满生命力?

在写作中,让文章充满生命力是很重要的一点。如果一篇文章缺乏生命力,那么读者很难被吸引,也很难从中获得任何收获。那么,如何让你的文章充满生命力呢? 以下是几个建议: 1.真实感情:写作的时候要…

Django_视图中的request对象详解(八)

目录 Request 属性 方法 QueryDict 源码等资料获取方法 Request 当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并创建一个包含请求元数据的 HttpRequest 对象 传入该函数的第一个参数,常用request表示。 HttpRequest实…

为什么要学习使用C++软件常用分析工具?学会这些工具都有哪些好处?

目录 1、为什么要学习使用C软件常用分析工具? 2、C常用分析工具有哪些?都能处理哪些具体的问题? 2.1、SPY 2.2、Dependency Walker 2.3、GDIView 2.4、Process Explorer 2.5、Process Monitor 2.6、调试器Windbg 2.7、反汇编工具IDA…

Android 13 startActivity报错ActivityNotFoundException

最近遇到一个问题,就是在google pixel 4(android 13)的手机上startactivity的时候报错activity找不到,其他非13的是好的,这里对问题进行记录: 查阅google官方的文档,有这么一段话, …

前端mock数据的几种方式

前端mock数据的几种方式 前端在开发具体需求前,后端往往只提供接口文档,对于前端来说,最简单的方式就是把想要的数据写死在代码里进行开发,但这样的坏处就是和后端联调前还需要再把写死的数据从代码里删除,最好的方式…

开发中易犯错的事务问题

1.不指定rollbackFor 使用spring的声明式事务(即Transactional注解)时,如果不指定rollbackFor,那么当程序发生Error时,事务将不会回滚!!!显然这将导致数据不一致! 如下述…

spring8-getBean()方法使用

;:getBean使用,要传数据,一个是字符串, 就是文件里的UserService 而这里的UserService就是我们配置文件的id:,第一个API 第二个API可以传入一个字节码类型。 如果某一个容器存在多个&#xff…

windows系统如何部署nacos

1.安装nacos 去nacos github下载nacos最新稳定版本,我用的是nacos-server-2.2.3.zip,下载后解压 2.创建数据库 启动mysql,创建数据库nacos,数据库名字是从conf/application.properties文件获得的 把db这三行取消注释&#xff…

【Hello mysql】 mysql的约束

Mysql专栏:Mysql 本篇博客简介:介绍mysql的约束 mysql的约束 表的约束空属性默认值列描述zerofill主键自增长唯一键外键总结 表的约束 为什么要有约束? 我们在收集一些数据的时候会要求该数据必须存在 比如说像是国家在登记公民信息的时候身…

实验二 常用网络命令

实验目的 了解常用网络命令及其使用方法。通过网络命令了解网络状态,并利用网络命令对网络进行简单的操作。 实验原理 1. 通过 ping 命令检测网络故障 (1)命令格式: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v T…

conic-gradient

The conic-gradient() CSS function creates an image consisting of a gradient with color transitions rotated around a center point conic-gradient方法创建了一个由围绕中心点旋转渐变组成的图片 background: conic-gradient( red 6deg, orange 6deg 18deg, yellow…

位图|布隆过滤器模拟实现|STL源码剖析系列|手撕STL

今天博主给大家带来位图和布隆过滤器的模拟实现。 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇…

并发编程 - 利用Event Bus模式实现目录文件变化捕捉

文章目录 Pre需求CodeDirectoryTargetMonitorFileChangeEventFileChangeListener测试 Pre 并发编程 - Event Bus 设计模式 需求 JDK自1.7版本后提供了WatchService类,该类可以基于事件通知的方式监控文件或者目录的任何变化,文件的改变相当于每一个事件…

Java继承和多态

文章目录 继承继承概念继承的语法 super关键字super和this继承方式多态多态的概念多态实现条件 重写重写和重载的区别 继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,事物之间可能会…

Linux 内核级通用内存池 —— kmalloc 体系

目录 kmalloc 内存池中都有哪些尺寸的内存块 kmalloc 内存池如何选取合适尺寸的内存块 kmalloc 内存池的整体架构 KMALLOC_RECLAIM 表示需要分配可以被回收的内存,RECLAIM 类型的内存页,不能移动,但是可以直接回收,比如文件缓存页…

【Linux】第一个Linux小程序——进度条

今天为大家带来一篇关于在Linux上编写的进度条小程序的博客。 正文 我们在日常生活中使用电子产品时,经常会遇到加载的过程,这时候这些加载界面总是会附带有一些进度条,这些进度条是加载进度的可视化图形,这篇文章我们就在Linux系…

基于云原生网关的全链路灰度实践

作者: 倪海峰(海迩) 前言 随着企业规模的不断扩大,传统单体应用已很难进一步支持业务的发展,业务的迭代速度已经难以满足业务的增长,此时企业会对应用系统做微服务化的改造,降低业务的耦合度&…

keepalived脑裂

keepalived脑裂及解决方法? 一.keepalived的脑裂是如何产生的?二、HAProxy1.HAProxy概念2.HAProxy主要特性3.HAProxy负载均衡策略 4.LVS nginx HAProxy的区别5.编译部署HAProxy 一.keepalived的脑裂是如何产生的? 脑裂:指在一个高…

Elasticsearch【优化、案例】(八)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_测试集群状态 Elasticsearch集群_故障应对&水平扩容 Elasticsearch优化_磁盘选择 Elasticsearch优化_分片策略 Elasticsearch优化_内存设置 Elasticsearch案例_需求说明 Elasticsearch案例_ES自动补全 Elasticsearch案例_创建索引 Elastic…