54

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

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

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

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

4

3 回答 3

53

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

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

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

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

  • 32kiB 拆分 L1i/L1d:每核私有(与早期的英特尔相同)
  • 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 中分配。请参阅英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?

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

一个处理器/核心是否可以访问彼此的缓存,因为如果允许它们访问彼此的缓存,那么我相信可能会有更少的缓存未命中,在这种情况下,如果该特定处理器缓存没有一些数据但其他一些数据处理器的缓存可能有它,从而避免从内存读取到第一个处理器的缓存?这个假设是否有效和真实?

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

    多级缓存的全部意义在于,单个缓存对于非常热的数据来说不够快,但对于仍然定期访问的不经常使用的数据来说就不够大了。 为什么在大多数处理器中,L1 缓存的大小都小于 L2 缓存的大小?

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

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

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

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

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

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

正常的解决方案是MESI 协议,或者它的变体。 英特尔使用 MESIF

于 2009-06-05T02:47:45.013 回答
14

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

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

于 2009-06-05T02:07:04.393 回答
4

首先回答你的问题,我知道 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/

于 2009-06-03T14:21:08.657 回答