对于多核CPU或多处理器系统中使用的缓存存储器,我有几个问题。(虽然与编程没有直接关系,但在编写多核处理器/多处理器系统软件时,它会产生许多影响,因此这里提出了这样的问题!)
发布于 2009-06-05 02:47:45
在多处理器系统或多核处理器(英特尔四核,核心二人等)每个cpu核心/处理器是否都有自己的缓存内存(数据和程序缓存)?
现代主流英特尔CPU(自第一代i7 CPU,Nehalem)使用3级缓存。
最后一级缓存是一个大型共享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除外)。
一个处理器/核心能否访问对方的缓存内存,因为如果允许它们访问对方的缓存,那么我相信可能会有较少的缓存错误,在这种情况下,如果特定处理器缓存没有一些数据,但是其他一些第二个处理器的缓存可能会因此而避免从内存中读取到第一个处理器的缓存?这个假设是否正确?
允许任何处理器访问其他处理器的高速缓存内存会有什么问题吗?
一个非常重要的相关问题是缓存一致性问题。考虑以下情况:假设一个CPU核心在其缓存中有一个特定的内存位置,并将其写入该内存位置。然后,另一个核心读取该内存位置。如何确保第二个核心看到更新的值?这就是缓存一致性问题。
正常的解决方案是MESI协议,或者它的一个变体。英特尔使用MESIF。
发布于 2009-06-05 02:07:04
快速回答1)是2)否,但这可能取决于您所引用的内存实例/资源,数据可能同时存在于多个位置。3)是。
关于这个问题的完整解释,您应该阅读Ulrich ( http://lwn.net/Articles/250967/ )的第9部分文章“每个程序员都应该知道关于内存的事情”,您将在一个很好的和可访问的细节中获得您似乎正在询问的问题的全部图片。
发布于 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/
https://stackoverflow.com/questions/944966
复制相似问题