超标量处理器设计:重排序缓存(ROB)

2024-05-10 04:20

本文主要是介绍超标量处理器设计:重排序缓存(ROB),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

★超标量处理器的很多地方用到了重排序缓存,但是我对它不是很了解,所以我整理一下重排序缓存的知识点。

重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit),也可以用来寄存器重命名。

ROB是一个先进先出的表,每个项是ROB表项,可以记录指令执行的信息。

ROB表项的字段

(1)Complete: 标志位,用来标记指令是否已经完成执行阶段。当指令的所有操作(包括计算、访存等)都完成,标志就会被置为“是”,指令准备好进入退休阶段。

(2)Areg:指令在程序代码中指定的目的寄存器(逻辑寄存器)。

(3)Preg:物理寄存器的编号,经过寄存器重命名后指令实际使用的物理寄存器。

(4)OPreg:Old Physical Register,记录Areg在被重命名到当前Preg之前所对应的物理寄存器编号。在指令因异常需要回滚恢复状态时,OPreg用于指向应该恢复的物理寄存器状态,确保异常处理后的状态正确。

(5)PC:指令的程序计数器(PC)值。当指令执行过程中遇到中断时,保存这个PC能够从正确的点重新开始执行程序。

(6)Exception:如果指令执行中触发了异常,字段会记录异常的类型。指令即将退休时,处理器会根据异常类型执行相应的处理逻辑,可能是中止指令执行、恢复现场或是执行特定的异常处理程序。

(7)Type:记录指令的类型,如算术逻辑运算、加载、存储、跳转等。指令退休时,处理器会依据不同的指令类型执行相应的动作,比如存储指令需要把结果写入数据缓存(D-Cache),分支指令则可能需要清理预测执行的痕迹(如恢复检查点资源)。

ROB工作原理

分发(Dispatch)阶段

指令从指令队列或解码阶段被取出,进入流水线执行。每个指令在进入流水线时,会在ROB中分配一个唯一的表项(Entry)。表项会记录该指令的初始状态。将complete状态位设为0,表示指令尚未执行完成。同时,指令的目的寄存器信息、PC值等也会被记录下来。

执行(Execution)阶段

指令在执行阶段完成计算后,将complete状态位设为1,该指令已经执行完毕,计算结果可能被暂时存储在ROB中或直接写入物理寄存器堆(PRF)。如果执行过程中发生异常,异常类型也会被记录在ROB对应的表项中,但异常的实际处理被推迟到提交阶段。

异常与退休(Exception & Commit)阶段

所有对程序状态的最终更改,包括结果的写回、异常处理,都发生在提交阶段。只有当指令的complete状态为1,且所有先前的指令(在程序顺序上)也已正确执行并退休时,该指令才能退休。计算结果根据Areg和Preg信息被写入到寄存器或内存中。

若存在异常,处理器会根据ROB中记录的异常类型进行相应处理,可能包括恢复现场、跳转到异常处理程序等。

ROB工作例子

所以ROB就是一个先进先出的队列,当后面的指令执行完必须等到前面的执行完才可以退休。

这篇关于超标量处理器设计:重排序缓存(ROB)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975422

相关文章

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序