如何在多核Intel CPU中共享高速缓存?

时间:2009-06-03 14:06:50

标签: performance x86 multiprocessing intel cpu-cache

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

  1. 在多处理器系统或多核处理器(Intel Quad Core,Core two Duo等......)中,每个cpu核心/处理器都有自己的缓存(数据和程序缓存)吗?

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

  3. 允许任何处理器访问其他处理器的缓存存在任何问题吗?

4 个答案:

答案 0 :(得分:43)

  

在多处理器系统或多核处理器(Intel Quad Core,   Core 2 Duo等。)每个cpu核心/处理器都有自己的缓存   内存(数据和程序缓存)?

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

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

  2. 现代主流英特尔CPU(自第一代i7 CPU,Nehalem)使用3级缓存。

    • 32kiB拆分L1i / L1d:私有每核(与早期英特尔相同)
    • 256kiB统一L2:私有每核。 (1MlaB on Skylake-avx512)。
    • 大型统一L3:在所有核心之间共享

    最后一级缓存是一个大型共享L3。它在物理上分布在核心之间,其中一片L3与连接核心的环形总线上的每个核心一起运行。每个核心通常具有1.5到2.25MB的L3缓存,因此多核Xeon可能在其所有核心之间共享36MB L3缓存。这就是为什么双核芯片有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的连接,以及连接到它的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缓存的原因。)

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

    2.   

      允许任何处理器访问其他处理器是否存在任何问题   处理器的缓存?

      1. 是的 - 根本没有连接各种CPU缓存到其他内核的连线。如果一个内核想要访问另一个内核缓存中的数据,那么它可以通过它实现这一目的的唯一数据路径就是系统总线。
      2. 一个非常重要的相关问题是cache coherency problem。请考虑以下事项:假设一个CPU核心在其高速缓存中具有特定的内存位置,并且它将写入该内存位置。然后,另一个核心读取该内存位置。您如何确保第二个核心看到更新的值?这就是缓存一致性问题。

        正常解决方案是the MESI protocol,或其变体。 Intel uses MESIF

答案 1 :(得分:12)

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

关于这个问题的全文解释,你应该阅读Ulrich Drepper(http://lwn.net/Articles/250967/)的9部分文章“每个程序员应该了解的关于记忆的内容”,你将全面了解你看来的问题。以良好和可访问的细节询问。

答案 2 :(得分:6)

英特尔文档

英特尔发布可能包含此类信息的per-generation datasheets

例如,对于我在旧计算机上使用的处理器i5-3210M,我查找3rd generation - Datasheet Volume 1和1.1“处理器功能详细信息”说:

  
      
  • 每个核心的32 KB指令和32 KB数据一级缓存(L1)
  •   
  • 每个核心的256 KB共享指令/数据二级缓存(L2)
  •   
  • 最多8 MB共享指令/数据第三级缓存(L3),在所有核心之间共享
  •   

英特尔称核心缓存共享技术为“英特尔智能缓存”。有关于它的维基页面存根:https://en.wikipedia.org/wiki/Smart_Cache

您可以通过仅包含基本缓存信息的ARK page for the processor找到数据表页面:

  

英特尔智能高速缓存:3 MB

另见:

答案 3 :(得分: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/