首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多核英特尔CPU中共享缓存内存?

如何在多核英特尔CPU中共享缓存内存?
EN

Stack Overflow用户
提问于 2009-06-03 14:06:49
回答 3查看 27.5K关注 0票数 55

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

  1. 在多处理器系统或多核处理器(英特尔四核,核心二人等)每个cpu核心/处理器是否都有自己的缓存内存(数据和程序缓存)?
  2. 一个处理器/核心能否访问对方的缓存内存,因为如果允许它们访问对方的缓存,那么我相信可能会有较少的缓存错误,在这种情况下,如果特定处理器缓存没有一些数据,但是其他一些第二个处理器的缓存可能会因此而避免从内存中读取到第一个处理器的缓存?这个假设是否正确?
  3. 允许任何处理器访问其他处理器的高速缓存内存会有什么问题吗?
EN

回答 3

Stack Overflow用户

发布于 2009-06-05 02:47:45

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

  1. 是。不同的芯片模型不同,但最常见的设计是每个CPU核心都有自己的专用L1数据和指令缓存。 在旧的和/或低功耗CPU上,下一级别的缓存通常是L2统一缓存,通常在所有内核之间共享。或者在65 as的Core2Quad上(在一个包中有两个core2duo芯片),每对核心都有自己的最后一级缓存,无法有效地进行通信。

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

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

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

在Skylake- all 512以外的CPU上,L3包含了每个核心的私有缓存,因此它的标记可以用作窥探过滤器,以避免向所有内核广播请求。也就是说,在私有L1d、L1i或L2中缓存的任何内容也必须在L3中分配。请参阅在英特尔核心i7处理器中使用了哪种缓存映射技术?

大卫·坎特( David Kanter)的沙桥写作有一个很好的内存共享/系统架构图,显示了每个内核缓存及其到共享L3的连接,以及DDR3 /DMI(芯片组)/ PCIe连接到该缓存。(这仍然适用于Haswell / Skylake-client / Coffee,但后面CPU中的DDR4除外)。

一个处理器/核心能否访问对方的缓存内存,因为如果允许它们访问对方的缓存,那么我相信可能会有较少的缓存错误,在这种情况下,如果特定处理器缓存没有一些数据,但是其他一些第二个处理器的缓存可能会因此而避免从内存中读取到第一个处理器的缓存?这个假设是否正确?

  1. 不是的。每个CPU核心的L1缓存紧密集成到该核心中。访问相同数据的多个核心将在自己的L1d缓存中拥有自己的数据副本,非常接近于加载/存储执行单元。 多个缓存级别的要点是,单个缓存对于非常热的数据不能足够快,但是对于仍然定期访问的较少使用的数据来说,它不能足够大。为什么在大多数处理器中,L1缓存的大小小于L2缓存的大小? 在英特尔目前的CPU中,去另一个核心的缓存不会比直接进入L3更快。或者,与仅仅构建一个更大/更快的L3缓存相比,实现这一目标所需的核间网格网络将是非常困难的。 内置到其他核心的小型/快速缓存就是为了加速这些核心。与其他提高缓存命中率的方法相比,直接共享它们可能会花费更多的能量(甚至更多的晶体管/芯片面积)。(功率是一个比晶体管计数或芯片面积更大的限制因素。这就是为什么现代CPU能够负担得起拥有大型私有L2缓存的原因)。 另外,您也不希望其他内核污染小型私有缓存,这可能是缓存与此核心相关的内容。

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

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

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

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

票数 54
EN

Stack Overflow用户

发布于 2009-06-05 02:07:04

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

关于这个问题的完整解释,您应该阅读Ulrich ( http://lwn.net/Articles/250967/ )的第9部分文章“每个程序员都应该知道关于内存的事情”,您将在一个很好的和可访问的细节中获得您似乎正在询问的问题的全部图片。

票数 14
EN

Stack Overflow用户

发布于 2009-06-03 14:21:08

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

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

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

有关核心2二重奏的更多信息,请阅读这篇整洁的文章。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/944966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档