Re-order Buffer(ROB)是处理器中非常重要的一个模块,它位于renamer与scheduler(RS)之间,并且也是execution unit(EU)的出口。ROB作为指令处理的后端,其主要任务是存储指令经由EU处理后得到的结果,并把该结果按照in-order顺序写回到寄存器文件。

Intel没有给出详细的ROB pipeline,下面的pipeline的描述以及分析主要基于参考资料以及本人的一些推断,不一定准确,仅供参考

Early ROB

ROB的目的为存储out-of-order的处理结果,并以in-order写回寄存器。不过早期的ROB与现在的ROB相比,虽然目的相同,但是实现却存在较大的区别,并且这部分的区别不仅仅在于ROB本身,还牵扯到out-of-order engine的其它部分。

早期的ROB的实现方式一直延续到Nehalem微处理器,从Sandy Bridge微处理器开始采用新的ROB实现方式。

早期ROB的相关部分的pipeline:

μops流经上述pipeline的过程分为以下几个步骤:

  1. μops以in-order顺序从renamer传输到RS,途中会经过ROB。
  2. 每个经过ROB的μop都会占用ROB中的一个项,主要都用于存储μop处理完成时得到的result,并且这些项会以μops经过的先后顺序(in-order)进行排列。
  3. 经过ROB后,μops会在RS内等待source operand就绪,一旦某μop所有的source都已就绪并且相应的EU可用的时,往EU发送μop。
  4. EU在处理完成μop后,会把处理的结果写回ROB中相应的那项。
  5. 同时,如果RS中有其他的μop需要该处理结果作为source,该结果可以直接从EU传输到RS。由于这种数据转移方式不经过front end以及back end(ROB),因此被称为in flight。
  6. 在ROB中,处理完成的μop需要按照in-order的顺序把执行结果写回寄存器文件,因此会把第一项(最早进入项)按照先后顺序把执行结果写入寄存器文件,这个过程叫做retirement。

另外,有些μops是不需要经过EU的处理的,这些μops可以直接在ROB内等待retirement。

ROB Read Port Stalls

如上面的描述,μop在source就绪前会在RS内等待,在此期间,就绪的source会被传送到RS,一旦所有的source都就绪,并且相应的EU可用时,μop就会被调度过去执行。

source分为memory operand、register operand、immediate operand,其中需要等待的只有memory以及register相关的source,我们这里讨论的是register operand。

RS的source入口有三个:

  • in flight。μop从EU处理完成后,执行结果会被写回ROB,如果此时RS也有μop需要该结果,则该执行结果作为source进入RS。一般来说,大部分指令的source都是in flight的,并且intel微处理器也基于这种情况对in flight的source传输进行了优化。
  • ROB read。如果在执行结果被写回ROB时,RS中并没有需要该结果的μop,则该执行结果不会进入RS,如果后来有新的μop需要以该执行结果作为source,只能从ROB中获取。不过这种获取source的方式可能会带来一些性能上的下降,我们会在下面进行分析。
  • register read。如果在执行结果被写回ROB时,RS中并没有需要该结果的μop,则该执行结果不会进入RS,如果后来有新的μop需要以该执行结果作为source,但是此时执行结果已被写回RRF,则直接从RRF中获取。这种情况的出现的机率较小,以Core微处理器为例,Core微处理器上的ROB有96项,RS有32项,也就是说只有当某个μop所需的source来自位于其之前超过128的μop才会出现这种情况。

in flight与register read在传输数据时都很块,问题在于ROB read。ROB向RS传输source的通道被称为ROB read port,每个read port在一个时钟周期内可以传输一个register operand,在P6上有两个read port,到了Core以及Nehalem时为3个。

以Core微处理器为例,现假设有两条如下的指令,并且edi、esi、esp、ebp都要从ROB获取:

mov [edi + esi], eax
mov [esp + ebp], ebx

它们分解成μops:

tmp1 ← edi + esi
mov [tmp1], eax
tmp2 ← esp + ebp
mov [tmp2], ebx

按由于两条指令之间没有依赖关系,所以如果EU可用的话,按理说第一、第三个μop可以同时被调度到不同的ALU(EU)执行。不过由于Core上只有3个read port,因此无法一次性读取四个source,那么就有一个μop需要延迟执行。

从程序上来说,出现这种情况的原因主要是频繁使用了Based Indexed Addressing以及对寄存器写入后间隔较长才去读取。因此避免出现ROB read port stalls的措施也比较简单:不要频繁使用Based Indexed Addressing以及对寄存器的写后读取读操作尽量别间隔太长。

Recent ROB

从Sandy Bridge微处理器开始,intel就采用了全新的ROB pipeline,其中ROB不再用于存储执行结果,而是只用于记录μops的状态,如下图所示

EU在处理完μop后直接写回物理寄存器(PRF)并改变ROB中μop的状态,然后RAT就可以根据ROB中的状态调整PRF映射,使得用户层看起来指令在以in-order的方式执行。这种ROB实现方式没有了ROB read port的限制,因此ROB read port stalls的现象不复存在。

Reference

Intel® 64 and IA-32 Architectures Optimization Reference Manual

Agner Fog - The microarchitecture of Intel, AMD and VIA CPUs

David Kanter - Inside Nehalem: Intel’s Future Processor and System

David Kanter - Intel’s Sandy Bridge Microarchitecture

转载于:https://www.cnblogs.com/TaigaCon/p/7604152.html

Re-Order Buffer相关推荐

  1. 计算机术语中英文对照表(流水线/微架构/体系结构/指令集)

    术语 翻译 描述 Intel Architecture (IA) IA架构 执行x86指令集的CPU架构 Pipeline 流水线 根据上下文,翻译做"流水线"或者"管道 ...

  2. Network (哈工大网课笔记)

    5层结构: application 应用层 transport 传输层 network 网络层 link 数据链路层 physical 物理层 TCP: 可靠, 面向连接, 字节流传输, 点对点 UD ...

  3. C# 对接顺丰-丰桥

    前言:是今年还是去年顺丰才把接口的事务转给丰桥公司了吧,这更新换代的导致我们以前的接口下的单老是被快递员说无效.顺便说一下,丰桥只提供与费用无关的接口,常用的下单,取消单,物流查询等.存在一些坑,在这 ...

  4. DPDK——REORDER LIBRARY 排序库

    一. 缘由 排序,不要与tcp流重组排序混淆,而且下文踢桃序列号和tcp序列号不是同一个.此库为非线程安全的. 二. 介绍 1.引言 Reorder Library 提供一种机制依据序列号对mbuf进 ...

  5. DPDK reorder库

    前言:对于有些任务比较重的工作,我们通常都会采用负载均衡的方法用以提高任务效率.然而有些应用报文对于报文顺序要求比较严格,这就要求在报文在经过负载均衡处理后,进一步处理前,重新调整报文的顺序,保证和进 ...

  6. 计算机Intel CPU体系结构分析

    前段meldown漏洞事件的影响,那段时间也正好在读Paul的论文关于内存屏障的知识,其中有诸多细节想不通,便陷入无尽的煎熬和冥想中,看了**<计算机系统结构>.<深入理解计算机系统 ...

  7. CPU体系结构 (转载) 向原创致敬

    原创地址: https://my.oschina.net/fileoptions/blog/1633021 作者: 黑客画布 受前段meldown漏洞事件的影响,那段时间也正好在读Paul的论文关于内 ...

  8. 深入理解Intel CPU体系结构【值得收藏!】

    了<计算机系统结构>.<深入理解计算机系统>.<大话处理器>等经典书籍,也在google上搜了一大堆资料,前前后后.断断续续的折腾了一个多月,终于想通了,现在把自己 ...

  9. 【纯干货!】深入理解Intel CPU体系结构

    看了<计算机系统结构>.<深入理解计算机系统>.<大话处理器>等经典书籍,也在google上搜了一大堆资料,前前后后.断断续续的折腾了一个多月,终于想通了,现在把自 ...

  10. 一文解析,Linux内核——Intel CPU体系结构

    一.CPU指令的执行过程 几乎所有的冯·诺伊曼型计算机的 CPU,其工作都可以分为 5 个阶段:取指令.指令译码.执行指令.访存取数.结果写回. 图1 CPU指令的执行阶段 1.取指令阶段 取指令(I ...

最新文章

  1. php的正则怎么写,一个正则的写法 php
  2. 为jQuery的$.ajax设置超时时间
  3. Mac OS X下配置Cocos2d-x for Android(Eclipse)IOS(Xcode)开发环境
  4. Oracle代码块详解,Oracle可执行代码块
  5. linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名
  6. oracle中sql语句排序,Oracle SQL排序方式与case语句
  7. macOS Monterey中最新的「通用控制」是什么?苹果设备如何使用通用控制功能!
  8. ECharts地图,echarts自定义map地图,echarts添加标注,自定义坐标、图标、icon
  9. json模块的转义dump 和反转义 loap
  10. RIME输入法配置双拼方案(Ubuntu下基于ibus)
  11. MYSQL启动失败,Can‘t create test file
  12. 什么是ColdFusion
  13. 好书推荐:《爱因斯坦的错误:天才的人性弱点》
  14. 自学Android,学多久可以加入字节跳动?
  15. 共享充电线项目市场分析报告
  16. react-navigation 6.x 学习(3)
  17. 剑灵力士卡刀ahk_技术宅分享 剑灵召唤一键卡刀代码使用教程
  18. 20ZR暑期集训 简单数据结构
  19. 问题记录vips.h:133: undefined reference to `vips_reduce‘ collect2: error: ld returned 1 exit status
  20. 乘坐北京地铁费用计算

热门文章

  1. php网页事件处理方法,PHP实现事件机制的方法
  2. 计算机二级新考纲什么时候出来,有计算机二级考试(VFP)的新考纲吗?
  3. hive 配置用户名_Hive的安装及配置
  4. linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)
  5. 减少php,如何减少PHP代码?
  6. python随机猜数字游戏_Python小游戏——猜数字教程(random库教程)
  7. 不会编程也能搞定一键打开文件
  8. NYOJ-数独(dfs)
  9. C++中STL-queue使用方法
  10. 设计模式系列之「观察者模式」