【问题标题】:How is the transitivity/cumulativity property of memory barriers implemented micro-architecturally?内存屏障的传递性/累积性属性是如何在微架构上实现的?
【发布时间】:2020-01-20 22:18:06
【问题描述】:

我一直在阅读有关 x86 内存模型的工作原理以及 x86 上屏障指令的重要性以及与 ARMv8 等其他架构的比较。在 x86 和 ARMv8 架构中,内存模型似乎(没有双关语)尊重传递性/累积性,即如果 CPU 1 看到 CPU0 的存储,而 CPU2 看到 CPU1 的存储,这只有在 CPU1 看到 CPU0 存储时才会发生,那么 CPU2 也必须看到 CPU0 的存储。我所指的示例是 Paul McKenney 著名论文第 6.1 节中的示例 1 和 2(虽然很旧,但在他最新的 perf 烹饪书中也有同样的内容,http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf)。如果我理解正确,x86 使用存储队列(或存储顺序缓冲区)在存储全局可见(即写入 L1D)之前对存储进行排序(以及其他微架构优化)。我的问题是 x86 拱门(和其他拱门)如何实现(微架构)传递性属性?存储队列确保特定 CPU 的存储以特定顺序在全局范围内可见,但如何确保由一个 CPU 生成的存储与由不同 CPU 生成的存储排序?

【问题讨论】:

    标签: x86 x86-64 cpu-architecture memory-barriers micro-architecture


    【解决方案1】:

    在 x86 上,只有一个一致性域。当它们提交到 L1d 缓存时,所有其他内核会同时看到存储。这与一般的 MESI 一起足以为我们提供所有线程都可以同意的总存储顺序。

    一些 ISA(包括 PowerPC)不具有该属性(实际上是因为物理内核中的已停用存储跨 SMT 线程的存储转发)。所以mo_relaxed 来自 2 个线程的存储 可以在 POWER 硬件上的 2 个其他读者以不同的顺序看到。 Will two atomic writes to different locations in different threads always be seen in the same order by other threads? (大概是 PowerPC 上的障碍阻止了该转发。)

    ARM 内存模型曾经允许这种 IRIW(Independent Reader Independent Writer)重新排序,但实际上没有 ARM 硬件可以做到这一点。 ARM 能够加强其内存模型,以确保所有内核都同意由多个其他内核完成的存储的全局顺序。

    (存储转发仍然意味着核心执行存储立即看到它,远在它成为全球可见之前。当然,核心需要加载顺序才能说他们看到任何东西关于他们观察到的独立写入的顺序。)


    如果所有核心必须就商店的全局排序达成一致,那么(在您的示例中)从 Core2 看到商店意味着 Core1 必须已经发生,并且您也可以看到它。

    (假设 Core2 使用适当的屏障或获取加载或释放存储来确保其存储发生在看到 Core1 的存储的加载之后。)


    可能也相关:

    【讨论】:

    • 最近,ARM 决定指定他们的模型是多拷贝原子的,所以我认为 IRIW 不再可行。
    • 这确实回答了我认为的问题。澄清一下,传递性和 TSO(至少在 x86 上)是使用 MESI 有效实现的,因为任何提交到 L1D 的写入都会 RFO 缓存行,从而有效地使其所有其他副本无效/删除。因此,如果任何 CPU(提交 CPU 除外)能够读取特定位置,则所有 CPU 都将能够读取它,即在这种情况下,不同 CPU 之间的 GV 存储的传播没有延迟。我的理解正确吗?
    • @BeeOnRope,正确。 ARM 确实转向了其他多副本原子性(基于您在不同答案中链接的论文)。大多数 ARM 系统使用 MESI/MOESI/AMBA 类型的协议,其中 RFO 是存储的缓存线。根据这个问题和所有相关问题的答案,使用此类协议通常会消除不同 CPU 以不同顺序看到存储的可能性,即保证存储的传递性(忽略逻辑核心之间 SLF 的电源 PC 情况)。这是一个公平的说法吗?
    • @Raghu:所有主流 ISA 都使用 MESI(或其变体),创建一个单一的连贯域。是的,这就是为什么对 L1d 的提交使存储对所有其他内核同时全局可见。其他核心读取该行的唯一机制是发送请求到 Share that Modified line。 (除了 PowerPC 在 SMT 线程之间的存储转发)。 x86 通过将存储提交的顺序限制为每个内核内的程序顺序来获得 TSO。 (TSO 是一个比仅存在所有商店的全球订单更强有力的术语)。
    • @Raghu:是的,像 ARM 这样的弱排序 ISA 可以在提交之前对不相邻的存储进行存储合并,而 x86 只能在背靠背的情况下将存储合并到同一行.如果最旧条目的行尚未处于 E 或 M 状态,则 ARM 可以扫描存储缓冲区以查找可能无序提交的条目。 IDK 这样做的实用性有多积极:每个时钟周期检查 N 个缓冲区条目的缓存状态标记似乎不切实际,但它可能会注意到 RFO 响应何时到达(进入 E 状态的行)。
    猜你喜欢
    • 2020-01-23
    • 2021-10-23
    • 2010-11-14
    • 2018-03-23
    • 2019-06-30
    • 1970-01-01
    • 2019-11-09
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多