处理器结构--ReorderBuffer

ReorderBuffer的作用

Reorder Buffer用来保存在乱序执行之前的(OOOE)指令执行顺序,当指令集合在乱序执行后按照原有指令顺序将结果提交。

ROB会将指令按照原有程序的顺序保存,这些指令会在被dispatched后添加到列表的一端,而当他们完成执行后,从列表的另一端移除。通过这种方式,指令会按他们dispatch的顺序完成。

实现方案

ROB的一种实现方案是环形缓冲区(类似于操作系统的IO缓冲区)。

在指令分发(dispatch)阶段在环形链表尾部增加指令集合。在指令完成阶段(complete)在头部增加从链表中移除的指令集。

  • 当头指针(head)赶上尾指针(tail)的时候,ROB处于Empty状态。
  • 当头尾指针都到了Buffer的末尾时,他们会再度环绕在最开始的指针处。
  • 当尾指针环绕并且追上头指针时,Buffer就已经满了

在ROB中的每个Entry都必须包含足够的信息,使得在完成阶段可以知道该指令是否已经完成:

  • Busy位 Busy位不是真正需要的,因为在complete阶段的头指针以及dispatch阶段的tail指针就是被用来追踪busy位所标志的Entries的
  • Issued位 Issued位也可能不需要,因为在complete阶段不关心指令是否已经发射
  • Finished位 Finished位是一个必要的信息,因为没有完成执行的指令是不允许进入complete阶段。当流水线的execution阶段把它的结果写到转发总线时,Finished位必须被写入。这也需要执行单元有一个指向ROB里面的每条已经完成的指令的指针。

当指令执行造成了异常时,指令地址必须保存下来。当异常被处理完后,PC寄存器将使用保存下来的指令地址重启。并且分支指令可能需要指令地址去决定PC寄存器去覆盖预测错误的分支。

重命名寄存器编号(Rename register number)对于完全知道重命名寄存器写入逻辑寄存器(Architected Register)也是有必要的。重命名寄存器编号能够用来检查重命名寄存器堆(RRF)中Valid位,判断指令是否完成。这也使得Finished位没有必要了。

ROB会提供一个非常便捷的位置用来存储逻辑寄存器编号(Logical Register Number),Complete阶段也需要逻辑寄存器编号去写入逻辑寄存器中(Architected Register File)

  • Speculative(预测)与Valid位 Speculative与Valid位也可能是不必要的,取决于如何从预测错误的分支覆盖的逻辑实现。推测指令永远无法到达重新排序缓冲区(ROB)的头部,因为之前的指令(包括分支)必须先完成。因此,分支将已经被解决,并且如果需要的话,在允许分支完成的任何(依赖于控制的)指令之前回复到初始状态。

如果在覆盖期间从重新排序缓冲器中移除控制依赖的指令,则不需要Valid位,否则,控制依赖指令必须被标记为无效,这样当它们到达重新排序缓冲器的头部时,它们可以被忽略。

流程

重新排序缓冲器的流程必须完成以下操作

  • 分配:在dispatch阶段为程序顺序指令在重新排序缓冲区中保留空间
    • 尾指针在重新排序缓冲器中选择一个位置
    • 将必要的信息加载到ROB中(如指令地址,重命名寄存器,逻辑寄存器等)
    • 尾指针自增
  • 等待:Complete阶段必须等待指令执行完毕
    • 在ROB头部的所有的指令全部执行完毕(finished),或者具有有效的重命名寄存器
    • 第一个未完成的指令完全停止
  • 完成:已结束(finished)指令允许将结果按顺序写入逻辑寄存器中(architected registers)。
    • 将重命名寄存器的值copy到逻辑寄存器中
    • 解除在重命名寄存器与逻辑寄存器之间的关系(将逻辑寄存器的Busy位设置成0)
    • 解除ROB的关系(通过将头指针递增)

参考资料

环形缓冲区 Reorder Buffer Reorder Buffer: register renaming and in- order completion The Reorder Buffer 寄存器堆

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaQ

源码阅读之CyclicBarrier

源码阅读是基于JDK7,本篇主要涉及CyclicBarrier常用方法源码分析。文中代码若格式排版不对,可点击底部的阅读原文阅读。 1.概述 CyclicBar...

34470
来自专栏用户2442861的专栏

muduo 4 网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

class Exception : public std::exception

17810
来自专栏黑泽君的专栏

day11_JSP+EL+JSTL学习笔记

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

18210
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— EndPoint 与 解析器

目前有多种 Eureka-Server 访问地址的配置方式,本文只分享 Eureka 1.x 的配置,不包含 Eureka 1.x 对 Eureka 2.x 的...

13500
来自专栏开源优测

[接口测试 - http.client篇] 16 基于http.client之POM实战一下

概述 关注公众号回复: http.client_pom_demo 获取本文示例源码 你需要了解以下知识和技术,以便掌握后续的实例代码: http.client常...

36480
来自专栏GreenLeaves

WebService 之 身份验证

  在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑到了WebService是安全问题,很容易想到通过一组用户名与密...

42370
来自专栏Java3y

Web开发模式【Mode I 和Mode II的介绍、应用案例】

开发模式的介绍 在Web开发模式中,有两个主要的开发结构,称为模式一(Mode I)和模式二(Mode II). 首先我们来理清一些概念吧: DAO(Data ...

35370
来自专栏开发与安全

muduo网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

一、Exception类封装 class Exception : public std::exception ?  #include <execinfo.h>...

25200
来自专栏芋道源码1024

面试问烂的 Spring AOP 原理

来源:https://www.jianshu.com/p/e18fd44964eb

24540
来自专栏aoho求索

Spring Cloud Bus中的事件的订阅与发布(一)

年前最后一篇文章,提前祝大家新年快乐! 下面进入正文。Spring Cloud Bus用轻量级的消息代理将分布式系统的节点连接起来。这可以用来广播状态的该表(比...

461100

扫码关注云+社区

领取腾讯云代金券