分支预测失败的处理

    由于现代的超标量处理器采用了很多预测的方法来执行指令,并不是流水线中所有的指令都可以退休(retire),例如当流水线中的某条分支指令发生了预测错误,或者某条指令发生了异常,那么在这条指令之后进入流水线的所有指令就不允许退休了;

  • 此时需要将这些指令从流水线中抹掉,并且对处理器进行状态恢复,然后从指定的地址开始重新取指令来执行。
  • 在流水线的提交(Commit)阶段需要重点关注的指令还有store指令,由于它只有在退休的时候才可以真正地改变处理器的状态(即写D-Cache),如果在这个过程中发生了DCache 缺失,store指令会阻碍流水线中所有位于它后面的指令继续退休,因此需要对store指令进行特殊的处理。
  • 在流水线的提交阶段还会对其他的指令有一些特殊的限制,以减少对处理器中其他部件的影响等
  • 上述的这些内容都是在提交阶段需要考虑的特殊情况

分支预测失败的处理 

当在流水线中发现一条分支指令预测失败时,在它之后进入到流水线的所有指令都变得不正确了,但是这些指令可能已经完成了取指令、重命名甚至是执行的过程,所以当发现分支预测失败时,这些错误的指令都应该从流水线中被抹掉,同时处理器的状态(包括RAT,ARF和PC值等内容)都应该被恢复到开始执行分支指令时的状态。

处理器状态恢复过程分为两个独立的任务

  • front-end recovery
    • rename stage之前的所有指令都抹掉;
    • 分支预测其中的GHR/BHR等历史状态表,进行恢复;
    • 使用正确的地址来取址;
  • back-end recovery
    • 将issue queue/store buffer/rob等内部组件中的错误指令都抹掉;
    • 对RAT进行恢复;
    • 被错误指令占据的物理寄存器和ROB空间也要被释放;

前端的状态恢复很快就可以完成,处理器此时可以从正确的地址开始取指令,这些被取出来的指令可以一直执行到流水线的重命名阶段之前,在这段时间内,后端的状态恢复也在继续。

当满足如上的时间关系时,流水线就不需要暂停;

在backend阶段,最重要的恢复是RAT的恢复,此处只描述基于统一的PRF的RAT恢复;

  • 此种方式,存在两个RAT:
    • 一个在renaming stage使用,其状态是speculative的,Speculative RAT;
    • 一个在commit stage使用,其状态永远是正确的,Architecture RAT(backup RAT); 

      

恢复流程如下:

  •  发现预测失败的分支指令;
  • 停止取新的指令,让流水线drain out, 等待分支指令之前进入到流水线的所有指令,都顺利离开流水线,包括分支指令;
  • 此时,还处在流水线中的所有指令,都是处于错误的路径上,可以将所有的指令都抹掉;
  • 将architectural RAT复制到speculative RAT, 完成恢复动作;
  • 从正确的地址开始取指令;

如果在等待分支指令之前的D-cache缺失的指令时,会因为等待时间过长而出现miss-prediction panalty过大的情况;

这种方式称之为recovery at retire, 需要等待预测失败的分支指令retire的时候,才可以进行处理器的状态恢复;

也可以不再retire阶段再恢复,比如在execution阶段进行恢复,可以使用checkpoint的方式,此处不描述;

 

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

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

相关文章

翻译: LLM大语言模型图像生成原理Image generation

文本生成是许多用户正在使用的,也是所有生成式人工智能工具中影响最大的。但生成式人工智能的一部分兴奋点也在于图像生成。目前也开始出现一些可以生成文本或图像的模型,这些有时被称为多模态模型,因为它们可以在多种模式中操作,…

代码随想录算法训练营第四十二天|背包问题理论基础、01背包理论基础(滚动数组)、416. 分割等和子集

代码随想录算法训练营第四十二天|背包问题理论基础、01背包理论基础(滚动数组)、416. 分割等和子集 背包问题理论基础 背包问题理论基础 文章讲解:https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E…

谈谈常用的分布式ID的设计方案?

典型回答 首先,我们需要明确通常的分布式ID定义,基本的要求包括: 全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。 有序性,通常都需要保证生成的ID是有序递增的。例如,在数据库存…

iframe 与主应用页面之间如何互相通信传递数据

背景 当我们的Web页面需要复用现有网站的页面时,我们通常会考虑代码层面的抽离引用,但是对于一些过于复杂的页面,通过 iframe 嵌套现有的网站页面也是一种不错的方式,。目前我就职的项目组就有多个业务利用 iframe 完成业务的复用…

springboot整合websocket实现控制输入流

WebSocket 是一种在客户端和服务器之间进行实时双向通信的协议。它提供了一种更高效、更可靠的替代方案,以替代传统的HTTP请求-响应模式。 WebSocket 的特点包括: 双向通信:客户端和服务器可以同时发送和接收消息,而不像HTTP一样需…

QT 基础篇

目录 QPushButton QT帮助文档 QT 对象树 QPushButton QPushButton是Qt图形界面控件中的一种,看英文的意思,他就是按钮,是最基本的图形控件之一。在我们的最基本的项目中,运行: 是一个空白的窗体,里面什么也没有&am…

云原生之深入解析如何在Kubernetes中快速启用Cgroup V2支持

一、cgroup v2 有哪些优势? Linux 中有两个 cgroup 版本:cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。Kubernetes 自 v1.25 起 cgroup2 特性正式 stable。cgroup v2 提供了一个具有增强资源管理能力的统一控制系统,cgroup v2…

在Node.js中使用MongoDB连接数据库、创建集合

本文主要介绍在Node.js中使用MongoDB连接数据库、创建集合的方法。 目录 连接数据库使用原生驱动程序连接MongoDB数据库使用Mongoose连接MongoDB数据库 创建集合使用mongodb驱动程序 连接数据库 在Node.js中使用MongoDB连接数据库有两种方式:使用原生驱动程序和使用…

静态HTTP应用的性能优化技巧

在Web开发中,静态HTTP应用以其简单、快速和安全的特点受到了广泛欢迎。然而,随着Web应用的规模不断扩大,性能问题也日益突出。本文将为你介绍一些静态HTTP应用的性能优化技巧,让你的应用飞得更快、更稳定。 一、压缩文件 文件压…

以pycharm为例,生成Python项目所需要的依赖库/包文档:requirements.txt

平时我们在编写或者使用别人的Python项目时,往往会看到一个文档requirements.txt,该文档是描述一个Python项目中的第三方库的名称以及版本。本文介绍导出python当前项目依赖包requirements.txt的操作步骤。 方法一:如果每个项目有对应的虚拟…

Sumdiv

title: Sumdiv date: 2023-12-12 21:45:09 tags: 分治 categories: 算法进阶指南 题目大意 求 A B A^B AB 的所有约数之和 m o d mod mod 9901 9901 9901( 1 1 1 ≤ \leq ≤ A , B A,B A,B ≤ \leq ≤ 5 ∗ 1 0 7 5 * 10 ^ 7 5∗107) 解题思路 将 A A A 分解质因数&…

4-Docker命令之docker export

1.docker export介绍 docker export命令是用来将docker容器中的文件系统导出为一个tar归档文件 2.docker export用法 docker export [参数] container [rootcentos79 ~]# docker export --helpUsage: docker export [OPTIONS] CONTAINERExport a containers filesystem a…

开源工业以太网现场总线协议栈汇总

开源现场总线协议栈 EtherNet/IP、EtherCAT master、Profinet开源汇总: EtherNet/IP:https://github.com/EIPStackGroup/OpENer EtherCAT master:https://gitlab.com/etherlab.org/ethercat EtherCAT master:https://github.com/OpenEtherCATsociety/soem http…

【C++】哈希表

文章目录 哈希概念哈希冲突哈希函数哈希表闭散列开散列 开散列与闭散列比较 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。 哈希概念 顺…

PHP基础 - 数据类型

数据类型 序号数据类型描述1字符串(String)用于表示文本数据2整型(Integer)用于表示整数数据3浮点型(Float)用于表示带有小数部分的数值4布尔型(Boolean)用于表示真或假两个状态5数组(Array)用于存储多个值的有序集合6对象类型(Object)用于表示自定义的复杂数据结构…

CPython(将Python编译为so)

环境 先配一下环境,我使用的是python3.8.5 pip install Cython 编译过程 我们准备一个要编译的文件 test.py def xor(input_string): output_string "" for char in input_string: output_string chr(ord(char) ^ 0x66) return output_string…

Redis - 事务隔离机制

Redis 的事务的本质是 一组命令的批处理 。这组命令在执行过程中会被顺序地、一次性 全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。 当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。 如果事务中的…

C++入门【7-C++ 存储类】

C 存储类 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类: autoregisterstaticexternmutablethread_local (C11) 从 C 17 开始,auto 关键字不再…

PyTorch深度学习实战(25)——自编码器

PyTorch深度学习实战(25)——自编码器 0. 前言1. 自编码器2. 使用 PyTorch 实现自编码器小结系列链接 0. 前言 自编码器 (Autoencoder) 是一种无监督学习的神经网络模型,用于数据的特征提取和降维,它由一个编码器 (Encoder) 和一…

20分钟部署ChatGLM3-6B

准备工作 1.下载源代码: https://github.com/THUDM/ChatGLM3 2.下载预训练模型: https://modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以创建一个py文件,直接使用如下代码下载到本地: from modelscope.hub.snapshot_dow…