CPU Study - Recovery when Prediction Fails

news2024/11/25 11:46:05

参考来源:《超标量处理器设计》—— 姚永斌

分支预测失败时,这条分支指令之后的所有指令都处在了错误的路径上(mis-prediction)。
这些指令都会被抹除掉 ,从而造成很多bubble,降低处理器性能,称之为分支预测失败时的惩罚(mis-prediction penalty)。
这些处在错误路径的指令有可能已经将处理器中某些部件的内容进行了修改,例如寄存器重命名阶段的重命名映射表(mapping table)。
因此需要对这些行为进行撤销,也称之为分支预测失败时的恢复(mis-prediction recovery)。

流水线不同阶段的分支预测检查

解码阶段

例如发现了一条无条件直接跳转指令(MIPS中的J指令),则这条分支指令的方向和目标地址都确定了。
如果发现这条分支指令之前被预测为不可跳转,就会发生预测失败。
但是如果在解码阶段发现预测失败,代价还是可以接受的,因为可以马上进行修复,惩罚也最小。
如果是间接跳转(MIPS中的JR指令),虽然可以判断预测方向是否为跳转,但是对寄存器中的内容无法确定。
因为读取寄存器过程在流水线后续阶段发生。
因此即使知道预测失败,也无法确定正确的取指地址。
此时可以简单暂停流水线,避免后续抹除指令造成的功耗浪费。

读取物理寄存器阶段

此阶段可能发生在寄存器重命名阶段之后,也可以发生在发射阶段之后,根据具体架构决定。
如果此时读取到了寄存器的数值,那么可以对间接跳转的预测目标地址进行检查。
如果目标预测错误,则使用正确的地址进行重新取指。但是这个时候仍然需要分支后流入流水线的指令全部清除,但是指令也可能已经进入发射队列。

执行阶段

不管什么类型分支指令都可以被计算出结果。一旦发现预测失败,需要抹除之后进入流水线的全部指令。并且由于超标量处理器采用乱序执行的方式,流水线中还有部分指令是在分支指令之前进入流水线的。
这些指令可能位于发射队列或者执行阶段,因为指令原有的顺序记录在重排序缓存ROB中,每条分支指令都有一个编号,因此可以通过ROB对分支预测失败的指令进行状态恢复。
ROB恢复

所有流水线中的分支指令编号都存放在一个FIFO中,它的容量等于处理器最多能支持流水线中的分支指令个数。
一旦满了就不能再往流水线中存放分支指令,也就是此时如果解码出分支指令,只能暂停流水线直到编号列表有空闲空间为止。
可以采用两个FIFO,一个存放空闲编号,一个存放使用编号。每一次预测失败或者分支指令退休,都会从使用编号FIFO释放并存入空闲FIFO。

执行阶段预测失败后的恢复方法

基于ROB的暂停流水线取指
当执行阶段发现一条分支指令预测失败时,将这个信息记录在ROB对应的表项中,并暂停流水线取指,但是保持流水线继续执行。
直到这条分支指令成为最旧的指令时,代表这条分支指令之前进入流水线的指令都已经退休,再将整个流水线抹除,从正确的地址开始取指。
虽然这个方法容易实现,硬件复杂度不高,但是需要暂停流水线,等待指令退休。一旦出现D-Cache miss的load指令,就会导致损耗很大。

基于Checkpoint方法恢复
在分支指令之后的指令更改处理器状态之前,将处理器状态保存起来。
保存的内容包括了寄存器重命名中的映射表以及分支指令下一条PC等等。
这种方法虽然耗费很多资源,但是恢复阶段的效率更高。

抹除流水线

执行阶段预测失败后的抹除流水线包括两部分:

  1. 抹除发射阶段之前的所有指令,因为发射之前都是In-Order顺序执行。
  2. 发射阶段以及之后的阶段通过编号列表tag list区分处于预测失败编号内的指令,通过广播比较编号。
    抹除ROB错误指令

但是指令抹除并不需要在一个周期内全部完成,因为一条分支指令预测错误后,需要重新从正确地址取指。
新的指令需要经过流水线好几个阶段才能达到发射阶段。
所以只需要在新的指令到达发射队列之前完成错误分支指令的流水线抹除即可。
所以每次广播错误预测分支指令编号数量都不会很多,保证在几个周期内完成即可。

Tag List 编号分配

对于N-Way超标量处理器而言,如果一个周期内解码的N条指令都是分支指令,那么空闲的编号列表 Tag List 就需要在一个周期内提供N个编号数值(多端口FIFO)。
但是这种会增加芯片的使用面积和功耗,并且绝大多数情况这类FIFO都是空置状态,利用率不高。
因此大部分处理器都会限制流水线解码阶段最多处理一条分支指令,如果从解码缓存(Instruction Buffer 取指与解码之间的缓存)解码出多一条分支指令,那么第二条分支指令及其后续指令都会延迟下一个周期。
因为分支指令在大部分程序中并不密集,因此这种方法对处理器性能不会影响太大。
而这个用于保存分支指令的缓存,主要可以存储预测结果,也就是只将预测为跳转的目标地址放在缓存中。
保存分支指令的缓存

还有一种特殊情况,就是当程序中存在自修改(self-modifying)的代码,可能将一条分支指令修改为普通计算指令。
此时需要将分支预测器内容清空,否则会发生此条计算指令预测为跳转,造成性能损失。

超标量处理器的分支预测

超标量处理器中,取指得到的一个地址,会从I-Cache中取出多条指令,组成一个指令组(Fetch Group)。
因此超标量处理器中的取指令地址并不是连续的,每次增加值等于指令组的字长。
如果只对取指令的地址进行预测,相当于只对指令组中的一条指令预测,而不是对整个指令组预测,就会降低分支预测的准确度。
因此要预测整个指令组,就需要指令组中所有指令的PC值。
以指令组长度为4举例:需要通过加法器获取PC + 4/PC + 8/PC + 12的数值。
由于在一个周期内完成,所有指令都会在一个Cache Line之内,因此可以实现同时预测分支指令的方向以及跳转地址。
预测一个周期内取出的所有指令

但是这样等于需要一个周期内提供4个PC预测数值对应地址,但往往只会用到一个端口(分支指令并不密集)。
如果在分支指令方向预测结束后再计算预测地址,会导致分支预测无法在一个周期内完成。
对于RISC指令集而言,大部分跳转指令的目标地址可以在取指阶段就可以被计算出来,并在进入I-Cache之前进行预解码区分分支指令。
对于超标量处理器需要的多端口场景,也可以通过交叠(interleaving)的方式让单端口存储器支持多端口功能。
交叠实现多端口PHT

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

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

相关文章

数学概念算法-打印100以内的素/质数

素数:只能被1和自己整除的数 暴力破解 埃氏筛选 找到第一个数字,如果它是素数,则把它的倍数全部划掉 比如数字2是素数,那么 4,6,8,10,12。这些数字肯定不是素数,所以不用再考虑,直接划掉即可 第二步&#…

ROS理论与实践学习笔记——3 ROS运行管理之ROS话题名称设置

名称重映射是为名称起别名,为名称添加前缀,该实现比节点重名更复杂些,不单是使用命名空间作为前缀、还可以使用节点名称最为前缀。两种策略的实现途径有多种: (1)rosrun 命令 (2)launch 文件 …

camody卡魔迪-准备新一年双十一推出iPhone快充充电宝

随着双十一购物节的临近,各大品牌纷纷推出创新产品以吸引消费者的目光。近日,知名科技品牌Camody卡魔迪宣布将在今年双十一期间推出一款全新的iPhone快充充电宝。这款充电宝不仅具备快速充电功能,还兼具时尚设计和便携性,预计将成…

ArcGIS中分区统计栅格值前需要进行投影吗(在投影坐标系下进行吗),为什么?

最近,我接到了一个分区统计栅格数值前需要进行投影,或者说是必须需要在投影坐标系下进行吗的咨询。 答案是不需要刻意去变。 但是他又说他把地理坐标系下分区统计结果与投影坐标系下的分区统计结果分别做了一遍,并进行了对比,两个…

通过docker安装thingsboard需要的postgresql数据库

1、下载docker的包 docker run --name postgresql -e POSTGRES_PASSWORDXXX123 -d registry.openanolis.cn/openanolis/postgres:10.21-8.6 进入postgresql,创建数据库 [rootlocalhost ~]# docker exec -it postgresql bash [root0940f42b2263 /]# su - postgre…

9.10Mean-Shift分割算法

基本概念 Mean-Shift 分割算法是一种非参数的特征空间点集的迭代查找算法,主要用于估计概率密度函数的模式。在计算机视觉中,它常用于颜色图像分割和目标跟踪。它通过迭代地移动每个数据点到其邻域内密度最大的地方,从而找到数据点的模式&am…

基于单片机的非接触智能测温系统设计

本设计主要由单片机STC8A8K64S4A12、OLED显示屏、非接触式测温模块MLX9061、无线通讯模块ESP8266以及声光报警模块等构成。系统通过非接触式测温模块MLX9061测量当前人员温度,温度通过OLED显示屏进行实时显示,当被测温度高于阈值,声光报警模块…

力扣16~20题

题16&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 双指针法&#xff0c;和15题差不多&#xff0c;就是要排除了&#xff0c;如果total<target则排除了更小的&#xff08;left右移&#xff09;&#xff0c;如果total>target则排除了更大的&#xff08;rig…

java语言基础案例-cnblog

java语言基础案例 象棋口诀 输出 package nb;public class XiangQi {public static void main(String[] args) {char a 马;char b 象;char c 卒;System.out.println(a"走日"b"走田""小"c"一去不复还");} }输出汇款单 package nb…

在java中使用redis

Redis Java使⽤ 引入依赖 Java 操作redis的客⼾端有很多.其中最知名的是jedis. 创建maven项⽬,把jedis的依赖拷⻉到pom.xml中 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…

机房空调远程控制-Thingsboard MQTT 接口说明

一、 概述 为实现节能环保需求&#xff0c;拓扑未来公司推出轻量级&#xff0c;使用简单的远程空调控制解决方案。该方案集成了现场环境温湿度采集功能&#xff0c;设备管理功能&#xff0c;远程控制功能。支持本地自动控制模式和远程控制模式&#xff0c;自动模式下&#xff…

Chromium 如何查找已经定义好的mojom函数实现c++

进程通信定义通常都是用.mojom文件或者idl文件格式 以content\common\frame.mojom里面的BeginNavigation函数为例。 一、如何查找BeginNavigation函数定义&#xff0c;在vscode里面直接搜索BeginNavigation&#xff0c;过滤条件 *.idl,*.mojom,*.cc 效果&#xff1a; 这样…

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

Python网络爬虫从入门到实战

目录 引言 一、网络爬虫的概念 二、 网络爬虫的基本工作流程 &#xff08;一&#xff09;过程&#xff1a; &#xff08;二&#xff09;安装requests模块和beautifulsoup4模块 &#xff08;三&#xff09;requests库的使用 1、requests库的基本介绍 2、导入requests库的…

新手教学系列——curl_cffi异步Session使用注意事项

在现代编程中,网络请求是应用程序交互的重要组成部分,尤其在爬虫和数据采集领域,异步请求的能力显得尤为关键。curl_cffi作为一个强大的库,使得Python开发者可以使用C语言的curl库高效地进行异步HTTP请求。本文将带您深入探索curl_cffi异步Session的使用注意事项,帮助您避…

详解正确创建好SpringBoot项目后但是找不到Maven的问题

目录 问题 解决步骤&#xff1a; 找到File->Project Structure... 设置SDK 设置SDKs 问题 刚刚在使用IDEA专业版创建好SpringBoot项目后&#xff0c;发现上方导航栏的运行按钮是灰色的&#xff0c;而且左侧导航栏的pom.xml的图标颜色也不是正常的&#xff0c;与此同时我…

设计模式01-类图及设计原理(Java)

一、设计模式综述 1.设计模式基本概念 设计模式&#xff08;Design Pattern&#xff09;是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 …

电商价格监测:开启品牌渠道管控新时代

在当今数字化高速发展的时代&#xff0c;电商领域如同一艘艘巨轮在浩瀚的网络海洋中破浪前行。然而&#xff0c;对于众多品牌而言&#xff0c;电商数据的庞大体量却犹如一片迷雾之海&#xff0c;要在其中准确找到自己需监测的 SKU&#xff0c;无异于大海捞针。 品牌的价格监测之…

Linux的启动流程、移植到开发板

1、linux驱动开发与裸机开发的区别 Linux系统驱动和裸机驱动的主要区别在于运行时的环境和依赖。Linux系统驱动依赖于Linux内核提供的API和服务&#xff0c;而裸机驱动则是在没有操作系统支持的情况下直接与硬件交互。因此&#xff0c;两者的开发和调试方法也有很大差异。 2、…

【Qt】控件概述(7)—— 布局管理器

布局管理器 1. 布局管理器2. QVBoxLayout——垂直布局3. QHBoxLayout——水平布局4. QGridLayout——网格布局5. QFormLayout——表单布局6. QSpacer 1. 布局管理器 在我们之前值ui界面进行拖拽设置控件时&#xff0c;都是通过手动的控制控件的位置的。同时每个控件的位置都是…