gpt4 book ai didi

assembly - 内核如何决定在 MESI 中使哪个缓存行无效?

转载 作者:行者123 更新时间:2023-12-04 07:40:53 24 4
gpt4 key购买 nike

我对缓存行有一些误解。我正在使用 HaswellUbuntu .现在假设我们有 2 线程应用程序,其中会发生以下情况。

mov [addr], dword 0xAC763F
;starting Thread 1 and Thread 2

现在假设线程并行执行以下操作:
Thread 1                        Thread 2
mov rax, [addr] mov rax, [addr]
mov [addr], dword 1 mov [addr], dword 2

现在在我的理解是这样的:
  • 在启动主线程之前写入相应的缓存行( addr )并将其标记为 Exclusive .
  • 如果两个线程 Thread 1Thread 2在开始写入之前完成读取,则缓存行的状态为 Shared在所有缓存中。

  • 现在我不明白哪个缓存标记为 Invalid 的行如果两个 mov [addr], dword 1Thread 1mov [addr], dword 2Thread 2 “同时”发生。

    首先“同时”感觉有点模糊。我认为这是“在同一个 CPU 时钟周期内”。 MESI如何协议(protocol)实现解决了这个“同时从不同线程写入的问题”。

    最佳答案

    I think of this as "during the same CPU clock cycle"



    不同的内核可以使用不同的时钟;例如一个核心可以是 4GHz,而另一个核心可以是 800MHz。 (不过,仅适用于 Haswell Xeon;双/四核部分的所有内核都在一个时钟域中。我已经读过,它与您在一个内核繁忙时查看空闲内核上的 CPU 频率所看到的相符。 )

    相关: What happens when different CPU cores write to the same RAM address without synchronization?是一个非常相似的问题。 (但是那个问题的 OP 不知道 MESI 是什么)。不过,我在那里更详细地介绍了发送 RFO 请求,所以如果这个答案太简洁,也许可以阅读该答案。

    Before starting the main thread writes to the corresponding cache line (addr) and marks it as Exclusive.



    核心必须先使高速缓存行处于独占状态,然后才能对其进行修改。实际上,对 L1D 进行写入会将其从 Exclusive 翻转为 Modified,而无需与其他内核通信。 (L1D 和 L2 是回写缓存)。

    但是,是的,如果两个内核在其中任何一个写入之前读取缓存行,它们都会使该行处于共享状态。他们只能在收到对该线路的 RFO 请求的成功回复后,才能将该线路翻转为独占。 Wikipedia's MESI article有状态转换图和 RFO 的定义。

    冲突的 RFO 请求当然有可能同时进行。 它们需要很多周期才能到达另一个核心,因此不同核心上的存储有足够的时间在各自接收 RFO 之前启动 RFO。 (并不是说这会阻止核心发送它自己的 RFO;写入任何一个 Invalid of Shared 行都需要一个 RFO 以使其进入 Exclusive 状态,以便存储可以提交。)

    我不是 100% 确定哪个请求获胜的决定将在 L3 缓存中决定。但

    Haswell 的 L3 具有包容性,并用作一致性流量的支持/过滤器。 L3 不是实际将所有请求广播到所有核心,而是包含标签,并带有额外的信息来跟踪哪些核心(可能)具有哪一行的副本。 L1 和 L2 是每个内核私有(private)的,因此 L3 是第一个共享级别的缓存。

    我猜 L3 会处理哪个核心的 RFO 首先完成的仲裁 ,因为它已经在跟踪哪些内核(可能)需要查看哪些 RFO。大概这是在保存相关物理地址的 L3 切片中完成的。

    As @fuz points out , MESI 是围绕总线拓扑设计的,而不是消息路由的更复杂的网络。英特尔的设计具有相同的状态,但并不像通常的 CPU 架构描述所说的那样简单地工作。

    所以,我们可以肯定地说: 通过某种未知的内部机制,CPU 决定第一个 RFO .当第一个仍在进行往返时,后一个到达可能会被取消(因此核心必须稍后重试),或者它可能会被缓冲。

    我们确实知道 Intel CPU 具有用于竞争原子 RMW 操作的硬件仲裁机制,例如 lock add [mem], eax .据推测,仲裁对同一行的多个只写访问的机制完全相同,因为唯一的区别是 lock ed 操作在操作期间保留线路,在此期间不响应无效请求。

    您可以谈论多个 RFO 请求在 L3 使用的“非核心”时钟的相同时钟周期内到达 L3 的同一片。

    这在 Haswell 的实践中可能是可能的; cores are connected with a bi-directional ring bus (每路 32 字节宽),因此每个(非核心)时钟周期有两条消息可以到达 L3 缓存的任何给定切片。此外,L3 的每个切片都连接到一个核心,因此来自该核心的请求也可以同时到达。

    在这种情况下,它可能很简单:如果一个切片甚至可以在同一个周期中接收到多个发往它的消息(而不仅仅是在环上传递),那么它可能是硬连线的,因此该切片的三个来源之一总是获胜.

    关于assembly - 内核如何决定在 MESI 中使哪个缓存行无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48969113/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com