Arm 如何冲洗管道?

Arm 如何冲洗管道?,arm,pipeline,cpu-architecture,Arm,Pipeline,Cpu Architecture,这是一个理论性的问题,我觉得自己被卡住了。假设我使用ARM ISA和流水线数据路径。我使用一个分支预测器,为了简单起见,它总是预测一个分支被执行。很明显,如果分支确实要被取下,它是有效的,但如果不是这样,它就失败了。如果失败,它必须回滚并撤消所有更改,即刷新管道 它应该如何做到这一点 如果某个值写入某个寄存器怎么办 那么,如何将该寄存器恢复到其先前的值?标志也是如此?因为这是在体系结构中定义的,所以您始终可以保证,如果分支预测失误,并且必须刷新管道,则以下所有指令都不会对体系结构产生可见的影响

这是一个理论性的问题,我觉得自己被卡住了。假设我使用ARM ISA和流水线数据路径。我使用一个分支预测器,为了简单起见,它总是预测一个分支被执行。很明显,如果分支确实要被取下,它是有效的,但如果不是这样,它就失败了。如果失败,它必须回滚并撤消所有更改,即刷新管道

它应该如何做到这一点

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


那么,如何将该寄存器恢复到其先前的值?标志也是如此?

因为这是在体系结构中定义的,所以您始终可以保证,如果分支预测失误,并且必须刷新管道,则以下所有指令都不会对体系结构产生可见的影响

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

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


在这种情况下,指令将能够完成,将结果写入临时寄存器或位置,CPU将有机制恢复状态(在刷新的情况下),或者只有在保证这些结果不能再刷新时才将临时结果提交到体系结构寄存器。

相关:。正如在评论中所讨论的,一种简单的刷新技术是等待预测失误的分支失效;然后寄存器状态就是您可以回滚到的正确顺序状态。否则,您将检查寄存器重命名状态,以便从预测失误中快速恢复(比异常的完全刷新更快)。如果没有某种回滚/恢复机制(通常涉及寄存器重命名),您无法执行推测性无序执行。您可以基于分支预测进行获取/解码,而无需任何特殊支持,但不能让任何推测指令修改体系结构状态的唯一副本。(正如Dric的回答所指出的,顺序管道可以让指令一直运行到回写阶段。因为它是顺序的,所以我们已经知道早期的指令没有出现错误或预测失误)。