在微架构中,我们使用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位于前面的指令读取到的是最新的值。
- 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芯片》