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

gol*_*ean 45 performance x86 intel multiprocessing cpu-cache

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

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

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

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

Ada*_*eld 45

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

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

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

现代主流的英特尔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中分配.请参阅intel core i7处理器中使用的缓存映射技术?

David Kanter的Sandybridge文章有一个很好的内存层次/系统架构图,显示了每个核心的缓存及其与共享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.

  • 8 年后更新:如今,CPU 通常具有私有的每核 L1 和 L2 缓存以及共享的 L3。(自 Nehalem 以来的英特尔。)L3 可以支持一致性流量,因此不必一直进入内存。 (3认同)
  • 解决方案的“多样性”实际上并不那么多种多样。几乎所有东西都使用 [MESI 协议](https://en.wikipedia.org/wiki/MESI_protocol) 的一些细微变化。许多高速缓存可以具有共享行的副本,但是一致性域(即系统)中只有一个高速缓存可以具有处于修改或独占状态的行。因此,要写入一行,CPU 会执行“读取所有权”操作,以确保系统中没有其他缓存拥有该行的副本。相关:原子读-修改-写如何工作(`lock inc [mem]`):/sf/ask/2757569531/ (2认同)

Pan*_*nic 12

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

有关该问题的全文解释,您应阅读Ulrich Drepper(http://lwn.net/Articles/250967/)的9部分文章"每个程序员应该了解的关于记忆的内容" ,您将获得有关该问题的完整图片.你似乎在一个好的和可访问的细节询问的问题.


Cir*_*四事件 6

英特尔文档

英特尔发布可能包含此类信息的每代数据表.

例如,对于我在旧计算机上使用的处理器i5-3210M,我查看第3代 - 数据表第1卷和第1.1版"处理器功能详细信息"说:

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

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

您可以通过ARK页面找到只有基本缓存信息的处理器的数据表页面:

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

也可以看看:


Aar*_*ron 4

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

回答你的第二个问题,我相信你的假设是正确的。如果处理器能够访问彼此的高速缓存,则显然会有更少的高速缓存未命中,因为处理器可以选择更多的数据。但是,请考虑共享缓存。对于 Core 2 Duo,共享缓存允许程序员将常用变量安全地放置在该环境中,这样处理器就不必访问其各自的一级缓存。

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

有关 core 2 duo 的更多信息,请阅读这篇简洁的文章。

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


归档时间:

查看次数:

20335 次

最近记录:

6 年,9 月 前