计算机体系结构----重排序缓冲(ROB)

ROB的思想:不按顺序完成指令,但在使结果对体系结构状态可见之前重新排序

  • 当指令被解码时,它会在 ROB 中保留下一个顺序条目
  • 当指令完成时,它将结果写入 ROB 条目
  • 当指令在 ROB 中最早并且无一例外地完成时,其结果移动到寄存器堆或存储器中
  • 缓冲有关已解码但尚未停用(retire)/提交(commit)的所有指令的信息

在这里插入图片描述

重排序缓冲的条目ROB Entry

在这里插入图片描述

  • 正确地将指令重新排序回程序顺序
  • 使用指令的结果更新架构状态,如果指令可以毫无问题地退出
  • 精确处理异常/中断,如果需要在停用指令之前处理异常/中断
  • 需要有效位来跟踪结果的准备情况,并找出指令是否已完成执行

ROB是环形缓冲器

在这里插入图片描述
ROB存在两个指针,一个用来指示最早进入ROB的指令,一个用来指示最晚的。

Tomasulo系统复习

在这里插入图片描述
详细的Tomasulo系统解释点击这个:计算机体系结构----寄存器重命名/Tomasulo算法

Tomasulo+ROB

在这里插入图片描述

  1. 在指令完成时首先将结果写入 ROB
  2. 在提交时将结果写入寄存器堆
  3. 如果后面的指令需要重排序缓冲区中的值怎么办?
  • 一种选择:流水线停顿
  • 更好的做法:从重排序缓冲区中读取值。

一个简易的假如ROB的流水线示意图如下:
在这里插入图片描述

访问ROB的方法1

寄存器值可以位于寄存器堆、重新排序缓冲区(或旁路/转发路径)中。

在这里插入图片描述

在这里插入图片描述
看上图可以发现,访问ROB中所需求的寄存器的值就是遍历法,从上往下一一比对ROB Dest reg ID 直到一样。

访问ROB的方法2

  1. 首先访问寄存器堆(检查寄存器是否有效)
  • 如果寄存器无效,寄存器堆存储包含(或将包含)寄存器值的重新排序缓冲区条目的 ID
  • 寄存器到 ROB 条目的映射: 如果寄存器堆有写入寄存器的飞行指令,则寄存器堆将寄存器映射到重新排序缓冲区条目
  1. 访问重新排序缓冲区
  2. 现在, 重新排序缓冲区不需要是内容可寻址的
    在这里插入图片描述
    相较于访问ROB方法1,方法2在寄存器堆中添加了Tag位,用于直接映射到ROB的条目,方便寻找。

ROB的流水线构造

  1. Decode(D):访问regfile/ROB,在ROB中分配条目,检查指令是否可以执行,如果可以,则调度指令
  2. Execute (E):指令可以无序完成
  3. Completion (R):将结果写入重新排序缓冲区
  4. Retirement/Commit (W):检查异常;如果没有,则将结果写入架构寄存器文件或存储器;否则,刷新流水线并从异常处理程序开始
  5. 按顺序调度/执行、无序完成、按顺序停用(retirement)

在这里插入图片描述

Tomasulo+ROB运行示例

初始状态

假设延时:Load:1, Add:2, Mult:6, Divide:12
在这里插入图片描述
可以发现 ,每条指令都在ROB中有一个条目(entry)

CC1:第一条Load发射

在这里插入图片描述

CC2:第一条Load完成地址计算;第二条Load发射

在这里插入图片描述

CC3:第一条Load执行完毕;第二条Load等待;MUL.D发射

在这里插入图片描述

CC4:第一条Load写回完毕;第二条Load等待;MUL.D等待操作数;SUB.D发射

在这里插入图片描述

CC5:第一条Load提交;第二条Load完成地址计算;MUL.D/SUB.D等待操作数;DIV.D发射

在这里插入图片描述

CC6:第二条Load执行完毕;MUL.D/SUB.D/DIV.D等待操作数;ADD.D发射

在这里插入图片描述

CC7:第二条Load写回完毕;MUL.D/SUB.D就绪;DIV.D/ADD.D等待操作数

在这里插入图片描述

CC8:第二条Load提交;MUL.D/SUB.D执行完第一拍;DIV.D/ADD.D等待操作数

在这里插入图片描述

CC9:SUB.D执行完毕;MUL.D执行完第二拍;DIV.D/ADD.D等待操作数

在这里插入图片描述

CC10:SUB.D写回完毕;MUL.D执行完第三拍;ADD.D就绪;DIV.D等待操作数

在这里插入图片描述

CC11:SUB.D等待提交;MUL.D执行完第四拍;ADD.D执行完第一拍;DIV.D等待操作数

在这里插入图片描述

CC12:ADD.D执行完毕;SUB.D等待提交;MUL.D执行完第五拍;DIV.D等待操作数

在这里插入图片描述

CC13:ADD.D写回完毕;MUL.D执行完毕;SUB.D等待提交;DIV.D等待操作数

在这里插入图片描述

CC14:MUL.D写回完毕;DIV.D就绪;SUB.D/ADD.D等待提交

在这里插入图片描述

CC15:MUL.D提交;DIV.D执行完毕第一拍;SUB.D/ADD.D等待提交

在这里插入图片描述

CC16:SUB.D提交;DIV.D执行完毕第二拍;ADD.D等待提交

在这里插入图片描述

CC26:DIV.D执行完毕;ADD.D等待提交

在这里插入图片描述

CC27:DIV.D写回完毕;ADD.D等待提交

在这里插入图片描述

CC28:DIV.D提交;ADD.D等待提交

在这里插入图片描述

CC29:ADD.D提交

在这里插入图片描述

ROB的折衷

  1. 优点 :
  • 概念简单,支持精确异常
  • 可以消除错误的依赖性
  1. 缺点:
  • 需要访问重新排序缓冲区以获得尚未写入寄存器文件的结果 ,CAM 或间接会增加延迟和复杂性
  1. 其他解决方案旨在消除缺点
  • History buffer
  • Future file
  • Checkpointing

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

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

相关文章

mathglm代码调试记录

论文地址:https://arxiv.org/pdf/2309.03241v2.pdf 项目地址:https://github.com/THUDM/MathGLM#arithmetic-tasks 数据集格式: 读取数据集代码: def make_loaders(args, create_dataset_function):"""makes t…

检测并批量导出项目文件中所有最近修改文件的实用工具

本篇文章主要讲解工具的使用和操作教程,这是一个能够检测项目内最近修改的文件并保留路径导出文件的实用工具。 日期:2024年1月10日 工具介绍: 这是一款可以帮助你自动检测并导出指定文件修改时间内的文件及文件目录的实用工具,在…

Python语言基础

目录 任务驱动式学习 任务一:输出问候语 一、Python程序的两种编程模式 二、Python程序的执行方式——解释执行 三、基本输入输出函数 任务二:计算圆的周长和面积 一、语句块缩进 二、变量与对象 三、数据类型及转换 四、数字类型及运算 五、…

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍 简介 在许多应用程序中,能够从远程服务器获取文件是一个非常有用的功能。本文将详细介绍如何在 Windows Forms (WinForms) 应用程序中使用 FTP 协议进行文件操作,包括连接到 FTP 服务器、列出目录、…

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

一、前言 计数器是并发编程中非常常见的一个需求,例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下,如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式,包括AtomicLong、LongAd…

3.4 在开发中使用设计模式

现在,我们应该对设计模式的本质以及它们的组织方式有了初步的认识,并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨,我们打下了坚实的基础。初步了解了UML的基本构建模块后,我们现在可以…

gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script

目录 一、Creating cache objects 1、Classic caches and Ruby 二、Cache 1、导入SimObject(s) 2、创建L1Cache 3、创建L1Cache子类 4、创建L2Cache 5、L1Cache添加连接函数 6、为L1ICache和L1DCache添加连接函数 7、为L2Cache添加内存侧和CPU侧的连接函数 完整代码…

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后,安防市场就成为了其全球最大的市场,也是成功落地的最主要场景之一。对于安防应用而言,智慧摄像头、智慧交通、智慧城市等概念的不断涌现,对于芯片产业催生出海量需求。今天,我将为大家梳理GLOBALCH…

自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 接上两篇文章继续 : 3.3 pytest支持的初始化和清除函数 学过unittest的都知道 ,unittest有四个函数 ,分别是 &#xff…

PPT插件-大珩助手-快速构建自己的图形

绘图板-快速构建自己的图形 通过手绘的方式,快速构建自己的想法和创意,通过在PPT中插入绘图,植入背景透明的绘图,点击画笔可切换橡皮擦,可以清空画板重新绘制。 素材库-存储图形 通过素材库存储自己的图形 图形调整…

操作系统期末考复盘

简答题4题*5 20分计算题2题*5 10分综合应用2题*10 20分程序填空1题10 10分 1、简答题(8抽4) 1、在计算机系统上配置OS的目标是什么?作用主要表现在哪个方面? 在计算机系统上配置OS,主要目标是实现:方便性、有…

如何把123转换成字符串的123

在许多编程语言中,将数字123转换为字符串的"123"是非常直接的。以下是几种常见编程语言的示例: Python num 123 str_num str(num) print(str_num) # 输出: 123 JavaScript let num 123; let str_num num.toString(); console…

three.js 学习笔记(学习中1.10更新) |

文章目录 three.js 学习笔记基础概念透视相机 第一个three.js应用threejs画布尺寸和布局canvas画布宽高度动态变化 坐标辅助器 THREE.AxesHelper实现动画效果requestAnimationFrame时间相关属性和方法 THREE.Clock类 相机控件 轨道控制器OrbitControls 灯光点光源点光源辅助观察…

m1 + swoole(hyperf) + yasd + phpstorm 安装和debug

参考文档 Mac M1安装报错 checking for boost... configure: error: lib boost not found. Try: install boost library Issue #89 swoole/yasd GitHub 1.安装boost库 brew install boostbrew link boost 2.下载yasd git clone https://github.com/swoole/yasd.git 3.编…

轻量化神奇!看3D模型格式转换工具HOOPS Exchange如何轻松实现减面操作?

现在很多CAD模型都比较复杂,有时候为了一些特殊用途(轻量化显示、布尔运算、CAE网格剖分等),需要到对原始模型进行减面操作。在HOOPS Exchange中,就提供了对模型进行减面操作支持,以下内容就是HOOPS Exchan…

亚信安慧AntDB数据库容灾复制原理

AntDB数据库作为通信运营商领域的杰出的数据服务提供者,一直以来都十分重视数据安全问题,不断通过技术进步、方案创新等方式提升数据容灾能力。在信息化的时代,数据已经成为了重要的资源,对于企业来说,如何存储和管理这…

docker微服务案例

文章目录 建立简单的springboot项目(boot3)boot2建立通过dockerfile发布微服务部署到docker容器编写Dockerfile打包成镜像运行镜像微服务 建立简单的springboot项目(boot3) 1.建立module 2. 改pom <?xml version"1.0" encoding"UTF-8"?> <…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

计算机网络期末复习(二)

物理层 解决&#xff1a;如何在连接各种计算机的传输媒体上传输比特流&#xff0c;而不是具体的传输媒体。 传输媒体&#xff1a;比如双绞线、同轴电缆、光纤等等。 主要任务&#xff1a;确定于传输媒体接口有关的一些特性。 传输媒体 导向形 非导向形 调制解调器 数字信号 和…

CSGO服务器搭建细节

在搭建CSGO服务器之前&#xff0c;我们首先需要确保电脑上已经安装好了所需的软件环境。这里我们需要安装SteamCMD和HLDSUpdateTool工具&#xff0c;并在安装之后进行相关的配置&#xff0c;才能顺利地跑起服务器。同时&#xff0c;在准备环境的同时&#xff0c;我们还要考虑服…