【发布时间】:2014-01-01 14:02:49
【问题描述】:
我了解在推测执行中需要重新排序缓冲区。但是,给定一系列没有任何分支的非推测指令,为什么所有这些指令仍然必须经过 ROB 然后按顺序提交?由于不存在控制风险,并且假设存在寄存器重命名以避免 WAR 和 WAW 风险,那么在这种情况下 ROB 是否是必要的?
我能想到的一个原因是处理不精确的异常。还有其他原因吗?
【问题讨论】:
-
“非投机指令”是什么意思?如果您有乱序执行,那么一切都是推测性的,直到退休。即使没有分支 - 你将如何回滚故障、中断等?出于同样的原因 - 您需要 ROB 在提交时恢复程序顺序。
-
通过非推测性指令,我的意思是不是推测性获取的指令(不是通过分支预测获取的指令,而是按正常程序顺序获取的指令),因此结果值的乱序写入不会导致任何问题.是的,例外是我们无论如何都需要 ROB 的原因之一。想知道是否还有其他原因。
-
相关:Out-of-order execution vs. speculative execution 是对@Leeor 的主要观点的另一种解释,即所有指令在退休之前都被视为推测性的。 Hadi 对同一问题的回答对在现代 OoO 设计以外的 CPU 上没有乱序执行的推测进行了更一般的讨论,反之亦然。
-
我想,至少在原则上,如果你有一系列没有分支/跳转的指令,并且没有任何可能出错的指令,CPU 可以在 ROB 中以简化的方式处理它们,例如,整个指令系列只使用一个 ROB 条目。这意味着一系列指令总是作为一种原子单元执行(例如,不能被中断)。尽管如此,具有寄存器目标的每条指令都会影响重命名状态,并且管理它是退休的一部分,因此它可能会使退休的重命名部分变得非常复杂。
-
事实上,macro-fusion 的思路是这样的:你找到两个或多个连续的指令,然后以一种只需要一个 ROB 条目的方式融合它们,然后被视为一个单元。实际上,除了宏融合单元中的最后一条指令之外,ROB 对原始指令“未使用”。毫不奇怪,由于上述重命名的复杂性,只有在存在单个(或零)目标寄存器的情况下,您才会在 x86 上看到这一点:特别是对于 ALU 操作后跟条件分支。
标签: x86 computer-architecture vliw