【问题标题】:How are cache memories shared in multicore Intel CPUs?多核 Intel CPU 中的高速缓存如何共享?
【发布时间】:2010-10-31 00:08:54
【问题描述】:

我有几个关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里问!)

  1. 在多处理器系统或多核处理器(英特尔四核、酷睿二双核等)中,每个 cpu 核心/处理器是否有自己的高速缓存(数据和程序高速缓存)?

    李>
  2. 一个处理器/内核能否访问彼此的缓存,因为如果允许它们访问彼此的缓存,那么我相信可能会有更少的缓存未命中,如果该特定处理器缓存没有一些数据,但其他一些第二个处理器的缓存可能有它,从而避免从内存读取到第一个处理器的缓存中?这个假设是否有效且正确?

  3. 允许任何处理器访问其他处理器的高速缓存内存会有什么问题吗?

【问题讨论】:

标签: performance x86 multiprocessing intel cpu-cache


【解决方案1】:

回答你的第一个问题,我知道 Core 2 Duo 有一个 2 层缓存系统,其中每个处理器都有自己的一级缓存,它们共享一个二级缓存。这有助于数据同步和内存利用。

为了回答您的第二个问题,我相信您的假设是正确的。如果处理器能够访问彼此的缓存,那么显然会有更少的缓存未命中,因为可供处理器选择的数据会更多。但是,请考虑共享缓存。在 Core 2 Duo 的情况下,共享缓存允许程序员在这个环境中安全地放置常用变量,这样处理器就不必访问它们各自的一级缓存。

要回答您的第三个问题,访问其他处理器的缓存内存可能存在问题,这属于“单写多读”原则。我们不能允许多个进程同时写入内存中的同一位置。

有关 core 2 duo 的更多信息,请阅读这篇简洁的文章。

http://software.intel.com/en-us/articles/software-techniques-for-shared-cache-multi-core-systems/

【讨论】:

    【解决方案2】:

    快速解答 1) 是 2) 否,但这一切都可能取决于您所指的内存实例/资源,数据可能同时存在于多个位置。 3)是的。

    有关该问题的完整解释,您应该阅读 Ulrich Drepper (http://lwn.net/Articles/250967/) 撰写的 9 部分文章“每个程序员都应该了解的内存”,您将全面了解您似乎正在询问的问题关于一个很好且易于理解的细节。

    【讨论】:

      【解决方案3】:

      在多处理器系统或多核处理器(英特尔四核、 Core 2 Duo 等)是否每个 cpu 核心/处理器都有自己的缓存 内存(数据和程序缓存)?

      1. 是的。它因具体的芯片型号而异,但最常见的设计是每个 CPU 内核都有自己的私有 L1 数据和指令缓存。

        在旧 CPU 和/或低功耗 CPU 上,下一级缓存通常是 L2 统一缓存,通常在所有内核之间共享。或者在 65nm Core2Quad(一个封装中的两个 core2duo 芯片)上,每对内核都有自己的最后一级缓存,无法高效通信。

      现代主流 Intel CPU(从第一代 i7 CPU,Nehalem 开始)使用 3 级缓存。

      • 32kiB 拆分 L1i/L1d:每核私有(与早期的 Intel 相同)
      • 256kiB 统一 L2:每核私有。 (Skylake-avx512 上 1MiB)。
      • 大型统一 L3:在所有内核之间共享

      最后一级缓存是一个大型共享 L3。它在核心之间物理分布,L3 切片与连接核心的环形总线上的每个核心一起使用。通常每个内核都有 1.5 到 2.25MB 的三级缓存,因此多核 Xeon 可能在其所有内核之间共享一个 36MB 的三级缓存。这就是为什么双核芯片有 2 到 4 MB 的 L3,而四核芯片有 6 到 8 MB。

      在 Skylake-avx512 以外的 CPU 上,L3包含每个核心的私有缓存,因此它的标签可以用作窥探过滤器,以避免向所有核心广播请求。即缓存在私有 L1d、L1i 或 L2 中的任何内容也必须在 L3 中分配。见Which cache mapping technique is used in intel core i7 processor?

      David Kanter's Sandybridge write-up 有一个很好的内存层次/系统架构图,显示了每核缓存及其与共享 L3 的连接,以及连接到该 L3 的 DDR3/DMI(芯片组)/PCIe。 (这仍然适用于 Haswell / Skylake-client / Coffee Lake,但后来的 CPU 中使用 DDR4 除外)。

      一个处理器/内核能否访问彼此的高速缓存,因为如果 他们被允许访问彼此的缓存,那么我相信那里 可能是较少的缓存未命中,在这种情况下,如果该特定 处理器缓存没有一些数据,但有一些其他的秒 处理器的缓存可能有它,从而避免从内存读取 第一个处理器的缓存?这个假设是否有效且正确?

      1. 没有。每个 CPU 内核的 L1 高速缓存都紧密集成到该内核中。访问相同数据的多个内核将在各自的 L1d 缓存中拥有自己的副本,非常靠近加载/存储执行单元。

        多级缓存的全部意义在于,单个缓存对于非常热的数据来说不够快,但对于仍然定期访问的不常用的数据来说就不够大了。 Why is the size of L1 cache smaller than that of the L2 cache in most of the processors?

        在英特尔当前的 CPU 中,离核到另一个内核的缓存不会比只到 L3 更快。或者,与仅构建更大/更快的 L3 缓存相比,实现这一点所需的核心之间的网状网络将是令人望而却步的。

        其他内核内置的小型/快速缓存可用于加速这些内核。与其他提高缓存命中率的方法相比,直接共享它们可能会花费更多的功率(甚至可能需要更多的晶体管/裸片面积)。 (与晶体管数量或芯片面积相比,功耗是一个更大的限制因素。这就是现代 CPU 能够负担得起大型私有 L2 缓存的原因。

        另外,您不希望其他内核污染可能缓存与 this 内核相关的内容的小型私有缓存。

      允许任何处理器访问其他处理器会不会有任何问题? 处理器的缓存?

      1. 是的——根本没有电线将各种CPU 缓存连接到其他内核。如果一个核心想要访问另一个核心缓存中的数据,那么它唯一可以访问的数据路径就是系统总线。

      一个非常重要的相关问题是cache coherency problem。考虑以下情况:假设一个 CPU 内核在其缓存中有一个特定的内存位置,并且它写入该内存位置。然后,另一个内核读取该内存位置。您如何确保第二个核心看到更新的值?这就是缓存一致性问题。

      正常的解决方案是the MESI protocol,或者它的变体。 Intel uses MESIF.

      【讨论】:

      • 解决方案的“多样性”实际上并没有那么多样化。几乎所有东西都在the MESI protocol 上使用了一些细微的变化。许多缓存可以拥有共享行的副本,但一致性域(即系统)中只有一个缓存可以拥有处于修改或独占状态的行。因此,要写入一行,CPU 会执行 Read-For-Ownership 以确保系统中没有其他缓存具有该行的副本。相关:原子读取-修改-写入的工作原理(lock inc [mem]):stackoverflow.com/questions/39393850/…
      • 8 年后更新:如今,CPU 通常具有私有的每核 L1 和 L2 缓存,以及共享的 L3。 (自 Nehalem 以来的英特尔。)L3 可以支持一致性流量,因此不必一直到内存。
      • 另外 NUMA (en.wikipedia.org/wiki/Non-uniform_memory_access) 是一个有趣且相关的话题。
      • 由于各种原因,这个答案需要进行大修:Nehalem 之后的所有内容都有 3 级缓存,以及各种轻微的技术错误陈述。我希望我设法改进了一些东西,而不会让没有 cpu 架构经验的人无法阅读。
      猜你喜欢
      • 2018-01-08
      • 2018-06-06
      • 2015-05-07
      • 2017-04-15
      • 2021-02-25
      • 2011-11-21
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多