【论文导读】Deconstructing Commit

在微架构中,我们使用Reorder Order在commit时保证in order的顺序,一般retire的方式都是等待指令成为oldest,然后retire,这样保证了architecture state和precise exception等。
但是实际上指令可能已经满足了retire的条件,只是因为该指令前面有指令一直没有执行完毕,导致需要持续的等待成为oldest,但是它实际上占据了physical register,register map entry,reorder buffer entry和LSQ slot。将已经执行完毕的指令提早retire可以尽早的释放资源。

接下来分析commit的必要条件

  • 未执行完毕,未执行完毕的肯定是不能commit了
  • WAR Hazard
    如果是write after read,如果我们把program order位于后面的write操作提早完成,那么就会提早的错误的更新寄存器的映射关系,导致program order位于前面的指令读取到的是最新的值。
    即使3提早执行完毕,也不能提交,因为一旦提交就会释放P16,导致2从P12读取r4
  • Unresolved Branch
    如果当前指令前面存在unresolved branch,那么实际上可能是位于mispredicted branch 分支上,而导致错误的更改了系统状态。
  • Exceptions
    如果当前指令前面可能存在异常指令,那么也不能提早commit。比如:
    1)可以在pipeline早期确定的instruction tlb miss, invalid ops以及后期才能确定的page fault和data tlb miss。如果当前指令前面存在未能计算出地址的指令并且访问TLB,也就无法明确是否存在exception
    2)计算指令,即除0或者溢出导致的exception
    3)ecc error
  • Replay Traps
    store-load 和 load-load会导致replay,如果yonger的load先执行完毕,但是older的store/load的地址刚刚出计算出来,而两者的地址相同,那么就需要replay yonger的load以拿到最新的值。
  • Memory Consistency Model
    这是由于consistency导致的replay,为了简化,我们采用weak-ordered model。我们对out of order commit的指令进行以下约束:
    1)不可逾越program order中前方的barrier 指令
    2)不可逾越program order中前方的相同地址的指令

以上各个原因所导致指令被不能commit的占比情况
在这里插入图片描述
最终的实现,相对于传统的ROB,在用于唤醒commit的status中增加了用于表征以上各个条件是否都满足的bit,此外也考虑到了提早commit时,ROB会留下空洞,使用shift的方式来移除ROB空洞。
在这里插入图片描述
最终的效果提升:因为资源提前释放的原因,那些会占满ROB/LSQ的benchmark的提升比较明显。
在这里插入图片描述

欢迎关注我的公众号《处理器与AI芯片》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用C++代码定义一个Cat类,其拥有静态数据成员numOfCats,记录已经创建的Cat对象的个体数目,静态数据成员numOfCatsGo,记录已经销毁的Cat对象的个体数目;静态成员函数getNumOfCats(bool IsConstruted),当IsConstruted为true时读取numOfCats,当IsConstruted为false时读取numOfCatsGo;数据私有成员weight,记录Cat对象的体重。 定义一个Boat类,其拥有数据私有成员weight,记录Boat对象的体重。 根据上述请完成如下内容: (1)请设计一个Cat类,体会静态数据成员和静态成员函数的用法。 (2)定义一个Cat类和Boat类的友元函数getTotalWeight(),计算一个Cat对象和Boat对象的体重和并返回。 输入格式 第一行输入正整数N,表示即将创建Cat类对象的个数, 第二行输入浮点数W0,表示一个Cat对象的体重 第三行输入浮点是W1,表示一个Boat对象的体重。 输出格式 首先先输出2N行数据,分别表示当前Cat对象创建时已经创建的对象个数,已经在内存中存在的对象个数;当前Cat对象销毁时,Cat对象在内存中存在的对象个数。(对应N个对象) 再输出1行表示Cat对象创建时已经创建的对象个数,已经在内存中存在的对象个数。(新创建一个对象,用于后续体重和计算) 然后输出一个Cat对象与一个Boat对象的体重和。 最后输出Cat对象销毁时,Cat对象在内存中存在的对象个数。 输入样例 复制 3 60.1 80.1 输出样例 复制 Cat Object is constructing, the constructed Number is 1, and the living Number is 1 Cat Object is deconstructing, and the living Number is 0 Cat Object is constructing, the constructed Number is 2, and the living Number is 1 Cat Object is deconstructing, and the living Number is 0 Cat Object is constructing, the constructed Number is 3, and the living Number is 1 Cat Object is deconstructing, and the living Number is 0 Cat Object is constructing, the constructed Number is 4, and the living Number is 1 140.2 Cat Object is deconstructing, and the living Number is 0
06-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值