【问题标题】:How to flush pipeline?如何冲洗管道?
【发布时间】:2016-07-25 22:13:51
【问题描述】:

这是一个理论问题,我觉得卡住了。假设我采用 ARM ISA 和流水线数据路径。我正在使用一个分支预测器,为简单起见,它总是预测一个分支被采用。很明显,如果确实要采用分支,它会起作用,否则会失败。如果失败,它必须回滚并撤消所有更改,即刷新管道。

它应该怎么做?

如果某个值被写入某个寄存器怎么办?

那我怎样才能把那个寄存器恢复到以前的值呢?标志也一样?

【问题讨论】:

  • 相关:Does a branch misprediction flush the entire pipeline, even for very short if-statement body?。正如那里的 cmets 中所讨论的,一种简单的刷新技术是等到错误预测的分支达到退休;然后寄存器状态有您可以回滚到的正确有序状态。否则,您检查寄存器重命名状态以从错误预测中快速恢复(比异常的完全刷新更快)。
  • 如果没有某种回滚/恢复机制(通常涉及寄存器重命名),就无法进行推测性的乱序执行。 您可以在没有任何特殊支持的情况下基于分支预测获取/解码,但您不能让任何推测性指令修改架构状态的唯一副本。 (正如 Dric 的回答所指出的那样,有序流水线可以让指令继续执行直到回写阶段。因为它是有序的,我们已经知道之前没有指令出错或被错误预测)。

标签: arm pipeline cpu-architecture


【解决方案1】:

正如架构中定义的那样,您将始终保证如果分支被错误预测并且必须刷新管道,所有后续指令都不会对架构产生明显影响。

有几种方法可以做到这一点:在简单的实现中(短管道),当保证指令不在分支中(可能出错的负载)时,通常会提交指令(即编写架构上可见的修改)阴影了。

在更复杂的 CPU、更长的流水线和无序内核中,使用的技术通常使用寄存器重命名:

https://en.wikipedia.org/wiki/Register_renaming

在这种情况下,指令将能够完成,将结果写入临时寄存器或位置,并且 CPU 将具有恢复状态(在刷新的情况下)或仅将临时结果提交给架构的机制当它有保证这些结果不能被刷新时注册。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2019-06-23
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多