如何冲洗管道?
How to flush pipeline?
这是一个理论问题,我觉得 stuck.Suppose 我采用 ARM ISA 和流水线数据路径。我正在使用一个分支预测器,为了简单起见,它总是预测一个分支被采用。很明显,如果确实要采用该分支,则它会起作用,否则会失败。如果失败,它必须回滚并撤消所有更改,即冲洗管道。
应该怎么做?
如果某个值被写入某个寄存器怎么办?
那我怎样才能将该寄存器恢复到它以前的值呢?旗帜也一样吗?
由于这是在体系结构中定义的,因此您始终可以保证,如果分支预测错误并且必须刷新管道,则所有后续指令都不会对体系结构产生明显影响。
有几种实现方式:在简单实现(短流水线)中,一般会在保证不在分支(A load that can be故障)影子了。
在更复杂的CPU中,更长的流水线和乱序的核心,通常使用的技术是寄存器重命名:
https://en.wikipedia.org/wiki/Register_renaming
在这种情况下,指令将能够完成,将结果写入临时寄存器或位置,并且 CPU 将具有恢复状态(在刷新的情况下)或仅恢复状态的机制将临时结果提交给体系结构寄存器,当它有保证这些结果不能再被刷新时。
这是一个理论问题,我觉得 stuck.Suppose 我采用 ARM ISA 和流水线数据路径。我正在使用一个分支预测器,为了简单起见,它总是预测一个分支被采用。很明显,如果确实要采用该分支,则它会起作用,否则会失败。如果失败,它必须回滚并撤消所有更改,即冲洗管道。
应该怎么做?
如果某个值被写入某个寄存器怎么办?
那我怎样才能将该寄存器恢复到它以前的值呢?旗帜也一样吗?
由于这是在体系结构中定义的,因此您始终可以保证,如果分支预测错误并且必须刷新管道,则所有后续指令都不会对体系结构产生明显影响。
有几种实现方式:在简单实现(短流水线)中,一般会在保证不在分支(A load that can be故障)影子了。
在更复杂的CPU中,更长的流水线和乱序的核心,通常使用的技术是寄存器重命名:
https://en.wikipedia.org/wiki/Register_renaming
在这种情况下,指令将能够完成,将结果写入临时寄存器或位置,并且 CPU 将具有恢复状态(在刷新的情况下)或仅恢复状态的机制将临时结果提交给体系结构寄存器,当它有保证这些结果不能再被刷新时。