【问题标题】:What's the relationship between CPU Out-of-order execution and memory order?CPU乱序执行和内存顺序有什么关系?
【发布时间】:2022-01-18 11:32:43
【问题描述】:

在我的理解中,CPU为了优化而改变了写在机器码上的操作顺序,称为乱序执行。

在术语“内存顺序”中,它定义了访问内存的顺序。例如,在宽松的顺序中,它定义了非常弱的排序规则,很容易发生执行重排序。
x86 中有一些内存排序模型,例如 TSO。在这样的内存排序模型中,定义了处理器对内存访问顺序的语义。

我不明白的是他们之间的关系。 内存顺序是一种乱序执行吗,OoOe还有其他方法吗?
或者,内存顺序是乱序执行的实现,处理器的所有重新排序都是基于语义的?

【问题讨论】:

    标签: memory cpu cpu-architecture memory-barriers


    【解决方案1】:

    一般问题是,在现代多处理器系统上,加载和存储指令可能会以与程序顺序不同的顺序对其他内核可见。乱序执行是可能发生这种情况的一种方式,但还有其他方式。

    例如,您可以有一个 CPU 以严格的程序顺序执行和退出所有指令,但是当它执行存储指令时,它不会立即将其提交到 L1 缓存,而是将其放入存储缓冲区中以写入稍后缓存。存储缓冲区可以设计为以不同于它们进入的顺序写出存储;例如,如果第一个存储错过了 L1 缓存但第二个会命中,您可以通过在等待第一个缓存行加载的同时写出第二个来节省时间。

    或者,即使存储缓冲区没有重新排序,您也可能会遇到这样的情况:当存储仍在存储缓冲区中等待时,CPU 会执行稍后按程序顺序出现的加载指令。因此,其他核心将看到在存储之前发生的负载。例如,x86 就是这种情况。

    内存排序模型以抽象的方式定义了程序员有权期望加载和存储对其他内核(或硬件等)可见的顺序。它通常还指定程序员在需要时如何获得更强的保证(例如,通过执行屏障指令)。然后必须将 CPU 设计为提供定义的行为,这可能会对它可以包含的功能施加限制。例如,如果架构承诺 TSO,则 CPU 可能无法包含能够重新排序的存储缓冲区,除非他们设法以如此聪明的方式做到这一点,以至于重新排序永远不会被其他内核注意到。

    相关问题:

    【讨论】:

    • 谢谢。我仍然想澄清一件事:您写道“乱序执行是可能发生这种情况的一种方式,但还有其他方式。”但这是否意味着乱序执行与内存重新排序无关(使用存储缓冲区等)?因为维基百科说“在现代微处理器中,内存排序表征了 CPU 重新排序内存操作的能力——它是一种无序执行。”所以我很困惑。 en.wikipedia.org/wiki/Memory_ordering
    • @hidetatz:这可能是语义问题。我想说,严格来说,写入内存或缓存不是存储指令的执行的一部分,通常是pipeline stage terminology。一旦指令计算出要存储的数据和目标地址,解决任何可能的异常,并将数据和地址放入存储缓冲区,则执行完成,即使实际写入缓存可能稍后发生。 [...]
    • @hidetatz:对,内存排序与执行排序是分开的。例如,现代 Intel CPU 推测地无序执行加载,但如果发现一切都不会好像加载按照 ISA 允许的顺序发生,则回退记忆模型。 (程序顺序 + 带有存储转发的存储缓冲区:Can a speculatively executed CPU branch contain opcodes that access RAM?)正如 Nate 所说,存储缓冲区基本上是必要的,以使其他内核免受存储的推测执行。
    • @hidetatz:所以从这个角度来看,维基百科的引用并不十分准确。但它们也可能意味着更非正式意义上的“执行”,即“CPU 所做的事情”,并且确实像存储缓冲区这样的东西会导致 CPU 以不同的顺序执行其某些功能(例如内存访问)节目顺序。从这个意义上说,它正在做某事的乱序。
    • @Nate 谢谢。现在我明白了,加载/存储与 ooo 执行并不完全相同。
    猜你喜欢
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2018-06-16
    • 2018-05-02
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多