首页 文章

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

提问于
浏览
38

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

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

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

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

4 回答

  • 12

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

    • 是的 . 它因精确的芯片型号而异,但最常见的设计是每个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中分配 . 见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缓存的原因) .

    另外,你可能不会缓存与此核心相关的东西 .

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

    • 是的 - 根本没有_2907002的缓存它可以通过它实现的数据路径是系统总线 .

    一个非常重要的相关问题是cache coherency problem . 请考虑以下事项:假设一个CPU核心在其高速缓存中具有特定的内存位置,并且它将写入该内存位置 . 然后,另一个核心读取该内存位置 . 您如何确保第二个核心看到更新的值?这就是缓存一致性问题 .

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

  • 39

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

    有关该问题的全文解释,请阅读Ulrich Drepper(http://lwn.net/Articles/250967/)的9部分文章"What every programmer should know about memory",您将获得您在好的和可访问的细节中看到的问题的全貌 .

  • 6

    Intel documentation

    英特尔发布per-generation datasheets,其中可能包含此类信息 .

    例如,对于我在旧计算机上使用的处理器i5-3210M,我查找3rd generation - Datasheet Volume 1和1.1 "Processor Feature Details"说:

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

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

    您可以通过ARK page for the processor找到数据表页面,其中只有基本的缓存信息:

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

    也可以看看:

    跨线程

  • 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/

相关问题