超标量处理器寄存器rename

news2024/11/25 12:45:35

 1.相关性介绍

       在CPU中,一段程序会被编译成一连串的汇编指令,指令与指令之间可能会具有相关性(dependency)。所谓相关性,即一条指令的执行会依赖于另一条指令的结果,相关性可以分为:① 数据相关性;② 存储器数据相关性;③ 控制相关性;④ 结构相关性。本文主要介绍数据相关性。

        数据相关性(Data Dependence)可以分为以下几种:

        ① Output dependence,又称写后写相关(Write After Write,WAW),表示两条指令都将结果写到同一个目的寄存器中。

        ② Anti-dependence,又称读后写相关(Write After Read,WAR),表示一条指令的目的寄存器和它前面某条指令的源寄存器是一样的。

        ③ True dependence,又称写后读相关(Read After Write,RAW),是真相关,表示一条指令的源寄存器来自于它前面某条指令的计算结果。

        数据相关性的三种类型WAW、WAR和RAW中,只有RAW是真相关,其他两种相关性都和寄存器的名字有关,可以通过使用不同的寄存器名字来解决,如下图所示:

         通过更换寄存器的名字,就可以解决WAW和WAR的相关性, 因此这两种相关性也称为假相关。现在RISC-V处理器一般都有32个通用寄存器(也叫逻辑寄存器或架构寄存器),如果在指令发生相关性时,就需要更多的物理寄存器来解决相关性问题。

        常见出现相关性的场景有:(1)循环loop,如果在一个循环体中向一个寄存器R1写入了值,并且每次循环的时候都会向R1写入值,那么就会产生大量的WAW相关,当寄存器用完时,WAW相关性就不可避免了,会导致程序变得很大,I-Cache缺失率升高。(2)代码复用,譬如有一个函数strcat()字符串拼接函数被频繁调用,处理器反复向一个寄存器R1写字符串,那么和第一种情况一样,也会发生WAW相关,导致同样的问题。

        解决办法就是用硬件来管理寄存器的重命名(register renaming)。处理器内部实际存在的寄存器称为物理寄存器(Physical Register)指令集中定义的寄存器称为逻辑寄存器(Logical Register)或者架构寄存器(Architecture Register)。物理寄存器的个数要多于逻辑寄存器的个数,这样才可以使寄存器rename起作用,譬如MIPS处理器定义了R0~R31这32个逻辑寄存器,处理器中真正存在的寄存器也就是物理寄存器有128个。处理器在进行寄存器重命名的时候,会动态地将逻辑寄存器映射到物理寄存器,这样可以解决WAW和WAR的相关性。

        如下图所示,有R0~R6共7个逻辑寄存器,有p0~p9共10个物理寄存器,编译器编译代码的时候会直接使用指令集中定义的逻辑寄存器,如图中左边的原始代码,箭头表示了指令之间存在的WAW/WAR相关性,通过寄存重命名的方法将它们消除掉,可以使原始程序获得并行性。

         图中的重命名映射表保存着映射关系,对于程序中的指令来说,它的源寄存器通过读取重命名映射表,就可以得到它们对应的物理寄存器了。经过重命名之后的程序不存在WAW和WAR的相关性了,因此在超标量处理器中,这个程序可以获得最大的并行性,从而尽快执行完毕。        

        再举个简单点的例子,如下三行代码发生了WAW相关,

        ① 在R2=R1+R0执行时,重命名映射表将R2映射到了物理寄存器p2上,将R1+R0的结果写到p2中。

        ② 在执行第二行指令,对R2逻辑寄存器进行WAW的时候,更新重命名映射表,将R2映射到物理寄存器p4上,然后将R1×R0的结果写到p4中。

        ③ 执行第三行指令,需要读取R2逻辑寄存器做加法,此时就会去查询重命名映射表,发现R2映射到了p4物理寄存器,所以其实就会去读取p4寄存器的值(R1×R0),然后再做加法。

         那么可能会产生一个疑问,p2物理寄存器怎么办?p2物理寄存器在WAW相关之后,映射的逻辑寄存器内的值被覆盖了,所以此时p2物理寄存器内存储的内容已经没用了,因此p2物理寄存器可以被释放,等待下一次有相关性冲突时,再被使用。

2.寄存器重命名设计方式

        针对超标量处理器设计中,实现寄存器重命名(Register Renaming)这个功能有很多种设计方式,可以分为:① 将逻辑寄存器(Architecture Register File,ARF)扩展来实现寄存器重命名;② 使用统一的物理寄存器(Physical Register File,PRF)来实现寄存器的重命名;③ 使用ROB来实现寄存器重命名。这三种方法本质都是讲指令集中定义的逻辑寄存器映射到物理寄存器上,从而可以增加寄存器的个数。

所以接下来,我们需要搞清楚几个问题:

(1)什么时候占用一个物理寄存器?

(2)什么时候释放一个物理寄存器?

(3)发生分支预测失败时,如何进行处理?

(4)发生异常(exception)时,如何进行处理?

2.1 使用ROB进行寄存器重命名

        这种方法将重排序缓存(ROB)作为了物理寄存器,在超标量处理器中,每条指令都会将自身的信息按照程序中原始的顺序存储到ROB中,当一条指令将结果计算出来之后,会将其写到ROB中,但是由于分支预测失败(mis-prediction)和异常(exception)等原因,计算的结果可能是错误的,这种状态称为推测状态(speculative)。

        在一条指令真正退休之前,它会一直待在ROB中,只有当指令变成最旧的指令并且被验证为正确的时候,才会离开ROB,并将它的结果写到ARF中。这种方式相当于将物理寄存器(PRF)和ROB集成到了一起。

        当一条指令被写到ROB中的一个表项(entry)时,这个表项在ROB中的编号也就成了该条指令目的寄存器对应的物理寄存器,这就将一个逻辑寄存器和ROB中表项的编号建立了映射关系,完成了对目的寄存器的rename过程,只要ROB中有空余的表项,那么rename就可以一直进行。

        ROB中存储着所有没有离开流水线的指令结果,而逻辑寄存器(ARF)中存储着所有“最新”离开流水线的指令结果。如果一个逻辑寄存器的值还在ROB中,那么重命名映射表会给出这个逻辑寄存器在ROB中所占用表项的编号。即当一条指令计算完毕,它的结果会被存储ROB的对应空间,当这条指令要离开流水线也就是退休时,它的结果会从ROB中更新到ARF中,这个位置的变动信息也要同步的更新到重命名映射表中。这样,一个寄存器在它的生命周期内,会有两个存放它信息的位置。

        虽然基于ROB的寄存器重命名方式便于管理,但存在一些缺点:① 很多指令没有目的寄存器,因此也就不需要对目的寄存器进行重命名,但每条指令都占用ROB中的一个表项。哪怕该条没有目的寄存器,它在ROB中对应的表项也无法将物理寄存器省掉,资源利用率不高。② 对于一条指令来说,它既可以从ROB中读取源操作数,也可以从ARF中读取源操作数。最坏情况下,4发射的超标量处理器,每条指令有2个源寄存器,那么ARF和ROB都要支持2×4=8个读端口,对芯片的面积和延时有较大负面影响。

2.2 使用ARF扩展进行寄存器重命名

        在指令的执行过程中,很多指令并没有目的寄存器,譬如store指令、分支指令和比较指令等,在一般的程序当中,这些指令大概占比25%左右。使用基于ROB的重命名方法会造成一定的资源浪费。因此,可以使用一个独立的存储部件,只有那些存在目的寄存器的指令才会占据这个存储部件当中的存储空间,这个部件称为PRF(Physical Register File),它可以看做ARF的扩展。

        每次指令被解码(decode)之后,那些存在目的寄存器的指令会占据PRF中的一个表项,这个表项的编号对应物理寄存器的编号,每当指令退休的时候,由于指令的结果会被写到ARF中,所以在PRF中,这条指令所占据的空间也就没用了,可以进行释放,因此,PRF本质上也可以使用FIFO实现。如果PRF中已经没有空间了,那么流水线中寄存器重命名阶段之前的所有流水线都需要暂停(stall前级流水),知道流水线中有指令离开而释放PRF的空间时,流水行才能继续执行。

        这种寄存器重命名的方式也需要一个重命名映射表,其中记录了每个逻辑寄存器的值是位于PRF中还是ARF中,一条指令在PRF中对应点的地址需要存储到这个表格中。

2.3 使用同一PRF进行寄存器重命名

        将2.2节中的ARF和PRF合并在一起合并之后的部件称为统一的PRF,其中存储了所有推测的(speculative)和正确的寄存器(retire)值。在这个PRF中,没有和指令产生映射关系的寄存器都是处于空闲(free)状态,当一条指令被重命名,并且它存在目的寄存器的时候,它就会占据PRF当中的一个寄存器,这个寄存器就处于占用的状态,处于这个状态的寄存器会经历:值没有被计算出来、值被计算出来但没有退休和退休三个过程。这种寄存器重命名方法也需要一个重命名映射表,用来存储每个逻辑寄存器和物理寄存器的对应关系。

        同样的,如果此时没有空闲的物理寄存器,代表此时物理寄存器已经全部被占用,则流水线重命名阶段及其之前的流水线就要被暂停,直到有指令退休而释放掉物理寄存器为止。

3.寄存器释放

        当一个物理寄存器不再被后面的指令使用时,这个物理寄存器就可以变为空闲状态了,只要最后一条使用这个物理寄存器的指令由于退休而顺利地离开了流水线,这个物理寄存器就可以变为空闲状态。

        具体的,当一条指令和后面的某条指令都写到同一个目的寄存器时,则后面的指令退休的时候,前面指令对应的物理寄存器就已经没有用处了。

         如上图所示,ADD和MUL两条指令都使用了r1作为目的寄存器。如果有一条指令使用了ADD的目的寄存器p1,作为源寄存器,那么这条指令必定位于ADD和MUL指令之间,当MUL指令退休时,则可以保证以后再也没有指令使用物理寄存器p1作为源寄存器了因此物理寄存器p1可以变为空闲状态。由于MUL指令,内容p1已经被p6覆盖了,指令MUL后面的指令如果还用到了逻辑寄存器r1作为源寄存器,肯定会使用物理寄存器p6。因此当指令MUL退休的时候,就可以释放物理寄存器p1。

        所以为了实现这个功能,在ROB中除了记录逻辑寄存器当前对应的物理寄存器之外,还需要存储它之前对应的物理寄存器,以便于在指令退休的事后,将它对应的旧映射关系的物理寄存器进行释放。

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

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

相关文章

el-table树形表格实现复选框多选效果

2023.7.26今天我学习了如何使用树形表格的时候进行复选框的多选效果。 当我们使用树形结构表格需要进行多选功能操作的时候会发现点击全选的时候,只有一级表格数据会被选中,问题如图: 我们需要实现的是点击全选的不管是几级表格数据都可以被…

ElasticSearch之IK分词器安装以及使用介绍

文章目录 一、IK 分词器简介1. 支持细粒度分词:2. 支持多种分词模式:3. 支持自定义词典:4. 支持拼音分词:5. 易于集成和使用: 二、安装步骤1、下载 IK 分词器插件:2、安装 IK 分词器插件:3. 安装…

各种知名游戏的技术分析

介绍一个GitHub,里面包括了市面上的各种游戏的技术分析,包括渲染管线、工作流、技术文章等等,在做某个类型的游戏的时候,可以针对某个游戏去进行技术参考,特别实用。 GitHub - OTFCG/Awesome-Game-Analysis: a compre…

C++设计模式之模板方法、策略模式、观察者模式

面向对象设计模式是”好的面向对象设计“,所谓”好的面向对象设计“指的是可以满足”应对变化,提高复用“的设计。 现代软件设计的特征是”需求的频繁变化“。设计模式的要点是”寻求变化点,然后在变化点处应用设计模式,从而更好地…

力扣天天练--week3-LeetCode75

topic75-9-t443:压缩字符串 题目描述: 给你一个字符数组 chars ,请使用下述算法压缩: 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 : 如果这一组长度为 1 ,则将字符追加到 s 中。 否则,需…

Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)

一、前提准备 在Spring Boot中整合MyBatis时,你需要导入JDBC(不需要手动添加)和Druid的相关依赖。 JDBC依赖:在Spring Boot中整合MyBatis时,并不需要显式地添加JDBC的包依赖。这是因为,当你添加mybatis-sp…

会捷通云视讯 list 目录文件泄露漏洞

劳动永远是医治精神创伤的良药。 漏洞描述 会捷通云视讯某个文件 list参数 存在目录文件泄露漏洞,攻击者通过漏洞可以获取一些敏感信息 漏洞复现 构造payload访问漏洞url: /him/api/rest/V1.0/system/log/list?filePath../漏洞证明: 文…

Mendix 创客访谈录|综合业务展示大屏应用开发

本期创客 刘书智 西门子工业领域专家 我在西门子工厂自动化工程有限公司工作。一直从事SCADA产品的技术支持工作,已经过去17个年头了。赶上数字化发展的浪潮,不断学习各种IT技术,践行 IT与OT融合,希望借助自己的IT知识助力OT的发…

编程实战班--C语言和Python语言实现五子棋游戏的代码

文章目录 下面分别是C语言和Python语言实现五子棋游戏的代码:C语言实现Python语言实现总结 下面分别是C语言和Python语言实现五子棋游戏的代码: C语言实现 在使用C语言实现五子棋游戏时,可以使用SDL2图形库来实现图形界面和图形绘制等功能&…

华为华三思科 交换机基础配置一览

console密码修改 华为 user-interface console 0 authentication-mode password set authentication password cipher XXXXXXXXX华三 line aux 0 authentication-mode password set auth pass simple XXX思科 en configure terminal line console 0 password 123 login忘记…

打开英雄联盟提示d3dcompiler47.dll缺失怎么修复

1.d3dcompiler_47.dll缺失的原因 损坏的文件:d3dcompiler_47.dll文件可能由于某些原因损坏,如病毒感染、意外删除等。 不兼容的操作系统:某些应用程序要求特定版本的d3dcompiler_47.dll文件,如果操作系统不兼容,则可能…

前端实现导出excel表格(单行表头)

需求:实现勾选行导出为表格 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号(最初我安装的版本号是0.18.16的版本)再次运行项目就不会报如下警告了 二、新建一个ex…

语音分帧简述

目录 1. 分帧 1.1 非整齐分帧 1.2 整齐分帧 2. 示例代码 1. 分帧 问题1:总帧数如何计算? 记符号N为语音总长度,FRAME_LEN为帧长,OVERLAP_LEN为帧与帧之间的重叠部分,STEP_LEN为帧移(步长)。则总帧数N_Frames计算…

kotlin 编写一个简单的天气预报app(二)

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…

AcrelEMS企业微电网能效管理平台实现用户侧智能配电和智能用电管理-安科瑞黄安南

摘要&#xff1a;随着科技的发展&#xff0c;电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向&#xff0c;将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

Rust vs Go:常用语法对比(八)

题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over two lists Iterate in sequence over the elements of the list items1 then items2. For each iteration print the element. 依次迭代两个列表 依次迭代列表项1…

【linux基础(一)】Linux基本指令(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 这里写目录标题 1. 前言1. 创…

[vulnhub]DC2

文章目录 [vulnhub]DC2信息收集flag1flag2cewlwpscan flag3什么是rbash&#xff1f; flag4flag5git提权 总结 [vulnhub]DC2 信息收集 扫ip&#xff0c;有两种方式&#xff1a;arp、nmap nmap -sP 192.168.56.0/24 -T4arp-scan -l192.168.56.137 扫端口&#xff1a; nmap -…

1312. 让字符串成为回文串的最少插入次数;971. 翻转二叉树以匹配先序遍历

1312. 让字符串成为回文串的最少插入次数 核心思想&#xff1a;最后的回文串有两种情况&#xff0c;一种是奇数回文串&#xff0c;一种是偶数回文串&#xff0c;奇数回文串的中心一定是原来就有的&#xff0c;偶数回文串的中心也是原来就有的。假设除去中心的部分为q,p,最后要…

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中&#xff0c;python默认为python 3.11。 基于应用&#xff0c;现需设置虚拟环境。 1.安装venv模块 从python3.3开始&#xff0c;配置python虚拟环境&#xff0c;可用venv模块&#xff0c;更加方便了。 执行命令&#xff1a; #apt install python3.11-venv 2.…