在多处理器系统或多核处理器(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缓存中拥有自己的副本,非常靠近加载/存储执行单元 .
脱离核心到另一个核心的缓存不会比在英特尔目前的CPU中转向L3更快 . 或者,与仅构建更大/更快的L3缓存相比,实现此目的的核之间所需的网状网络将是令人望而却步的 .
内置于其他内核的小/快速缓存可以加速这些内核 . 与其他提高缓存命中率的方法相比,直接共享它们可能会花费更多的功率(甚至可能更多的晶体管/芯片面积) . (功率是一个比晶体管数量或芯片面积更大的限制因素 . 这就是现代CPU可以承受大型私有L2缓存的原因) .
另外,你可能不会缓存与此核心相关的东西 .
允许任何处理器访问其他处理器的缓存存在任何问题吗?
是的 - 根本没有_2907002的缓存它可以通过它实现的数据路径是系统总线 .
一个非常重要的相关问题是cache coherency problem . 请考虑以下事项:假设一个CPU核心在其高速缓存中具有特定的内存位置,并且它将写入该内存位置 . 然后,另一个核心读取该内存位置 . 您如何确保第二个核心看到更新的值?这就是缓存一致性问题 .