编辑:在进一步缩小真正令我困惑的地方之后,进行了实质性的编辑。我试图使问题的一般概念保持不变,以保持收到的好答案的相关性。
最佳答案
x86上的MESI点与几乎所有多核/ CPU系统上的点相同:增强缓存一致性。 x86上的等式的缓存一致性部分没有使用“部分一致性”:缓存是完全一致性的。因此,可能的重新排序是相关的缓存系统以及与核心本地组件(例如加载/存储子系统(尤其是存储缓冲区)和其他乱序机器)的交互作用的结果。
交互的结果是x86提供的经过架构的强大内存模型,仅进行了有限的重新排序。没有连贯的缓存,您将根本无法合理地实现此模型,或者几乎无法实现除完全弱化之外的任何模型。
您的问题似乎嵌入了这样的假设,即只有可能的状态是“连贯的”和“其他所有状态”。此外,还有一些缓存一致性的思想(主要是专门处理缓存,并且大部分是隐藏的细节)与内存一致性模型混合在一起,后者由体系结构定义并且将由每个体系结构实现2。 Wikipedia explains指出,缓存一致性和内存一致性之间的一个区别是,前者的规则一次仅适用于一个位置,而一致性规则适用于各个位置。实际上,更重要的区别是内存一致性模型是唯一在架构上记录的模型。
简而言之,英特尔(和AMD同样)定义了一个特定的内存一致性模型x86-TSO3-就内存模型而言,它相对较强,但仍比sequential consistency弱。与顺序一致性相比,被削弱的主要行为是:
为了使实现这个内存模型,必须通过规则的各个部分来实现它。在所有最新的x86上,这意味着有序的加载和存储缓冲区,避免了不允许的重新排序。使用存储缓冲区会导致上面提到的两个重新排序:如果不允许这些重新排序,则实现将非常受限制,并且可能会慢得多。实际上,这也意味着完全一致的数据高速缓存,因为如果没有这种保证,许多保证(例如,没有负载-负载重新排序)将很难实现。
总结一下:
1如果您的内存模型是完全弱的,即没有对跨核重新排序真正施加任何限制,我想您可以以便宜的方式直接在非缓存一致性系统上直接实现它,以实现正常操作,但是内存障碍可能会变成这非常昂贵,因为它们将需要刷新本地私有(private)缓存的很大一部分。
2各种芯片可能会在内部以不同的方式实现,特别是某些芯片可能会实现比模型更强的语义(即,永远不会观察到某些允许的重新排序),但是没有错误的bug都不会实现较弱的错误。
3这是该论文中给它命名的名称,我之所以使用它是因为Intel自己没有给它起名字,并且该论文是一个更正式的定义,而不是Intel通过一系列石蕊测试给出的非正式模型。
4在x86上,您通常使用锁定指令(使用
lock
前缀)而不是单独的障碍,尽管也存在独立的障碍。在这里,我将仅使用术语Barries来指代独立的屏障和嵌入在锁定指令中的屏障语义。
关于caching - MESI在Intel 64和IA-32上的意义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843709/