我最近在这个链接https://en.wikipedia.org/wiki/Out-of-order_execution
中了解到无序执行CPU有些东西我不太明白。为什么这些CPU不麻烦?我的意思是,如果我有乱序执行的指令,即使它们适用于不同的数据,我也不能达到根据程序顺序不更新数据的情况吗?
我的意思是,如果我有类似的东西:
x = 1;
y = 2;
x = x+y;
print x;
print y;
什么阻止“print y”指令在“print x”之前被执行?
也许我对这种CPU有些不对劲,你能解释一下吗?
提前致谢
答案 0 :(得分:2)
在无序处理器中,指令按顺序执行,但按顺序执行。这意味着外部可见状态按顺序可见。写入内存(包括I / O操作)在本地缓冲,以便它们可以按顺序释放到外部存储器系统,类似地,寄存器结果使用寄存器重命名在本地存储。这允许本地处理器使用早期推测值而不违反外部可见的排序。在错误的推测中,回滚机制用于将状态恢复到先前已知的有效状态。
请注意,只要无序结果是非推测性的并且不违反排序保证,技术上结果对处理器核心外部状态的承诺就不必有序。 。对于弱内存一致性模型,这可以(理论上)允许值在无序外部可见。 (I / O必须是有序的,因此仍然需要按顺序提交打印示例。)此外,如果其他核心知道值本质上是有推测性的,那么这些值可以在外部可见 - 按顺序(理论上)和价值观的消费者会因错误的推测而回滚。 (这将“外部可见”从外部扩展到单处理器内核扩展到外部一些更大的系统组件,这些组件意识到推测并支持回滚。)
(在非常不切实际的理论中,将推测性实现扩展到人机界面将是可能的如果接口的定义允许这样的故障(即,人类纠正了错误推测的值和排序)。然而,由于人类甚至比大多数I / O设备更慢(推测将在更短的时间范围内解决而非显着),并且这种推测的扩展将是非常复杂的并且通常是不期望的,因此不太可能被广泛使用。 )
答案 1 :(得分:0)
早期的乱序架构非常麻烦。非常麻烦。根本问题在于它们无法保证精确的中断。由于Smith& Sons提出的解决方案,这在80年代末/ 90年代初期发生了变化。 Pleszkun的seminal paper。他们引入了重新排序缓冲区的想法,该缓冲区允许指令按顺序发出,但按顺序提交。