CPU 乱序执行会导致内存重新排序吗?

Can CPU Out-of-Order-Execution cause memory reordering?

我知道 store buffer and invalidate queues 是导致内存重新排序的原因。我不知道乱序执行是否会导致内存重新排序。

在我看来,乱序执行不会导致重新排序,因为结果总是按顺序退出,如 this question 中所述。

为了让我的问题更清楚,假设我们有这样一个松弛的内存一致性架构:

内存重新排序还能在这个架构中发生吗?

内存屏障是否有两个功能,一个是禁止乱序执行,另一个是刷新失效队列和排空存储缓冲区?

是的,乱序执行肯定会造成内存重排序,比如load/loadre-ordering

加载值何时绑定到加载指令与其说是加载顺序退役的问题。例如,Load1 可能在程序顺序上先于 Load2,Load2 在 Load1 之前从内存中获取其值,并且例如,如果 Load2 读取的位置存在中间存储,则发生 Load/load 重新排序。

但是,某些系统(例如 Intel P6 系列系统)具有额外的机制来检测此类情况以获得更强的内存顺序模型。

在这些系统中,所有加载都被缓冲直到退役,如果检测到可能存储到此类已缓冲但尚未退役的加载,则加载和程序顺序指令将被“删除”,并恢复执行艺术,例如,Load2.

我将此称为 Freye 规则窥探,因为我了解到 IBM 的 Brad Freye 比我认为的早很多年发明了它。我相信标准的学术参考文献是 Gharachorloo。

即与其说是退休前的缓冲负载,不如说是提供与退休前的缓冲负载相关的检测和校正机制。许多 CPU 提供缓冲直到报废,但不提供这种检测机制。

另请注意,这需要类似基于 snoop 的缓存一致性。许多系统,包括具有此类机制的 Intel 系统,也支持非相干内存,例如可以缓存但由软件管理的内存。如果允许对此类可缓存但 non-coherent 内存区域进行推测性加载,则 Freye 规则机制将不起作用,内存将弱排序。

注意:我说的是“缓冲到退休”,但如果你仔细想想,你可以很容易地想出缓冲到退休的方法。例如。当所有较早的加载都已被绑定时,您可以停止这种窥探,并且不再有任何可能甚至可传递地观察到干预存储。

这可能很重要,因为“提前退休”可以获得相当多的性能,在所有较早的指令退休之前从缓冲和修复机制中删除加载等指令。提前退役可以大大降低故障硬件机制的成本。