【发布时间】: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