我了解在推测执行中需要重新排序缓冲区。但是,给定一系列没有任何分支的非推测指令,为什么所有这些指令仍然必须经过 ROB 然后按顺序提交?由于没有控制风险,并且假设存在寄存器重命名以避免 WAR 和 WAW 风险,那么在这种情况下 ROB 是否必要?
我能想到的一个原因是处理不精确的异常。还有其他原因吗?
我了解在推测执行中需要重新排序缓冲区。但是,给定一系列没有任何分支的非推测指令,为什么所有这些指令仍然必须经过 ROB 然后按顺序提交?由于没有控制风险,并且假设存在寄存器重命名以避免 WAR 和 WAW 风险,那么在这种情况下 ROB 是否必要?
我能想到的一个原因是处理不精确的异常。还有其他原因吗?
在真正的乱序机器中,没有非推测指令之类的东西,一切都必须经过重新排序缓冲区,因为在分配的管道阶段,您不知道要清除什么以及提交什么,因为任何较旧的分支可能尚未执行。在任何时候,此类分支都可能被解析为错误预测,并刷新所有较年轻的 ROB 条目。
我想您可以通过在每个条件分支上停止分配来防止控制风险,但这会产生可怕的性能并通过转动每个分支消除乱序执行的许多好处(其平均频率通常预计为每5条指令)进入一个序列化点和一个停顿。
必须通过 ROB 的另一个“好处”是寄存器重命名。如果没有有序索引,您将无法根据程序顺序管理物理寄存器以使其有意义。假设您有 3 个连续的指令:
inc rax
add rbx, rax ; assume rbx is the dest
inc rax
说rbx
准备好晚了,当它终于准备好执行时add
,乱序引擎怎么知道rax
取哪个值?你现在已经有了旧值,+1
and和所有这些都准备好了 - OOO 机器应该在 add 进入 ROB 时+2
将源标记为 rax 的重命名版本。顺便说一句,还有其他方法可以实现这种正确性,但它们更复杂,并且仍然需要排序队列。