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