我对多核CPU或多处理器系统中使用的高速缓存存储器有几个问题。 (虽然与编程没有直接关系,但是当一个人为多核处理器/多处理器系统编写软件时会产生很多反响,因此请问这里!)
在多处理器系统或多核处理器(Intel Quad Core,Core two Duo等......)中,每个cpu核心/处理器都有自己的缓存(数据和程序缓存)吗?
一个处理器/核心是否可以访问彼此的缓存内存,因为如果允许它们访问彼此的缓存,那么我认为可能存在较少的缓存未命中,如果该特定处理器缓存没有一些数据,但一些其他第二处理器的缓存可能有它,从而避免从内存读取到第一个处理器的缓存?这个假设是否有效且真实?
允许任何处理器访问其他处理器的缓存存在任何问题吗?
答案 0 :(得分:43)
在多处理器系统或多核处理器(Intel Quad Core, Core 2 Duo等。)每个cpu核心/处理器都有自己的缓存 内存(数据和程序缓存)?
是。它因精确的芯片型号而异,但最常见的设计是每个CPU内核都有自己的专用L1数据和指令缓存。
在旧的和/或低功耗CPU上,下一级缓存通常是L2统一缓存,通常在所有核之间共享。或者在65nm Core2Quad(一个封装中有两个core2duo芯片)上,每对内核都有自己的最后一级缓存,无法高效通信。
现代主流英特尔CPU(自第一代i7 CPU,Nehalem)使用3级缓存。
最后一级缓存是一个大型共享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)。
一个处理器/核心可以访问彼此的缓存,因为如果 他们被允许访问彼此的缓存,然后我相信那里 可能是较小的缓存未命中,如果那个特定的情况 处理器缓存没有一些数据,但其他一些数据 处理器的缓存可能有它,从而避免从内存中读取 第一个处理器的缓存?这个假设是否有效且真实?
没有。每个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缓存的原因。)
另外,您不希望其他核心污染小型私有缓存,这可能会缓存与此核心相关的内容。
允许任何处理器访问其他处理器是否存在任何问题 处理器的缓存?
一个非常重要的相关问题是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/