【问题标题】:Which cache mapping technique is used in intel core i7 processor?英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?
【发布时间】:2018-08-12 01:12:47
【问题描述】:

我了解了不同的缓存映射技术,例如直接映射和完全关联或集合关联映射,以及它们之间的权衡。 (Wikipedia)

但我很好奇现在英特尔酷睿 i7 或 AMD 处理器中使用的是哪一个?

这些技术是如何演变的?还有哪些地方需要改进?

【问题讨论】:

标签: x86 intel cpu-architecture cpu-cache amd-processor


【解决方案1】:

现代高性能 CPU 基本上从不使用直接映射缓存。相同大小的组关联缓存在命中率方面的巨大优势超过了节能,而控制逻辑的复杂性仅稍高一些。如今,晶体管的预算非常庞大。

对于软件来说,至少有几个彼此相距 4k 倍数的数组是很常见的,这会在直接映射缓存中产生冲突未命中。 (如果循环需要一次遍历所有数组,则调整具有多个数组的代码可能涉及倾斜它们以减少冲突未命中)

现代 CPU 速度如此之快,以至于 DRAM 延迟超过 200 个核心时钟周期,这对于强大的乱序执行 CPU 来说也太大了,无法很好地隐藏缓存未命中。


多级缓存是必不可少的(并且使用的是所有高性能 CPU)为最热门的数据提供低延迟(约 4 个周期)/高吞吐量(例如 up to 2 loads and 1 store per clock, L1D 缓存和向量加载/存储执行单元之间的 128、256 甚至 512 位路径),同时仍然足够大以缓存合理大小的工作集。在物理上不可能构建一个非常大/非常快/高度关联的缓存,其性能与当前典型工作负载的多级缓存一样好;当数据必须物理传输很远时,光速延迟是一个问题。电力成本也将令人望而却步。 (事实上​​,功率/功率密度是现代 CPU 的主要限制因素,请参阅Modern Microprocessors: A 90-Minute Guide!。)

所有级别的缓存(除了 uop 缓存)都在我知道的所有 x86 CPU 中进行了物理索引/物理标记。大多数设计中的 L1D 缓存从页面偏移下方获取其索引位,因此也是 VIPT,允许 TLB 查找与标签获取并行发生,但没有任何混叠问题。因此,不需要在上下文切换或任何事情上刷新缓存。 (一般见this answer for more about multi-level caches和VIPT速度技巧,以及一些实际x86 CPU的一些缓存参数。)


私有(每核)L1D / L1I 和 L2 缓存是传统的组关联缓存,小型/快速缓存通常为 8 路或 4 路。所有现代 x86 CPU 上的高速缓存行大小为 64 字节。数据高速缓存是回写的。 (AMD Bulldozer 系列除外,其中 L1D 使用一个小的 4kiB 写入组合缓冲区进行直写。)

http://www.7-cpu.com/ 具有良好的缓存组织/延迟数、带宽和 TLB 组织/性能数,适用于各种微架构,包括许多 x86、like Haswell

英特尔 Sandybridge 系列中的“L0”解码微指令缓存是集关联和虚拟寻址的。最多 3 个块(最多 6 个微指令)可以缓存来自 32 字节机器代码块中指令的解码结果。相关:Branch alignment for loops involving micro-coded instructions on Intel SnB-family CPUs。 (uop 缓存是 x86 的一大进步:x86 指令是可变长度的,难以快速/并行解码,因此缓存内部解码结果以及机器代码 (L1I$) 具有显着的功率和吞吐量优势。强大仍然需要解码器,因为 uop 缓存不大;它在循环(包括中到大循环)中最有效。这避免了 Pentium4 错误(或基于当时的传输器大小的限制)具有弱解码器和依赖跟踪缓存。)


现代 Intel(我假设是 AMD)L3 aka LLC aka 最后一级缓存使用索引功能,而不仅仅是一系列地址位。这是一个散列函数,可以更好地分配事物以减少固定步幅的冲突。 According to Intel my cache should be 24-way associative though its 12-way, how is that?.


从 Nehalem 开始,英特尔使用了大型包含共享 L3 缓存,用于过滤内核之间的一致性流量。即当一个核心读取另一个核心的 L1d 中处于修改状态的数据时,L3 标签会说明哪个核心,因此 RFO(读取所有权)只能发送到该核心,而不是广播。 How are the modern Intel CPU L3 caches organized?。包容性属性很重要,因为它意味着任何私有 L2 或 L1 缓存都不能在 L3 不知道的情况下拥有缓存行的副本。如果它在私有缓存中处于 Exclusive 或 Modified 状态,则 L3 将具有该行的无效数据,但标签仍会说明哪个核心可能有副本。绝对没有副本的核心不需要发送有关它的消息,从而通过核心和 L3 之间的内部链路节省电力和带宽。有关英特尔“i7”(即 Nehalem 和 Sandybridge 系列,它们是不同的架构但使用相同的缓存层次结构)的片上缓存一致性的更多详细信息,请参阅Why On-Chip Cache Coherence Is Here to Stay

Core2Duo 具有共享的最后一级缓存 (L2),但在 L2 未命中时生成 RFO(Read-For-Ownership)请求的速度很慢。因此,具有适合 L1d 的小缓冲区的内核之间的带宽与不适合 L2 的大缓冲区(即 DRAM 速度)一样慢。当缓冲区适合 L2 但不适合 L1d 时,会有一个快速的大小范围,因为写入核心将其自己的数据驱逐到 L2,其他核心的负载可以在不生成 RFO 请求的情况下命中。 (参见 Ulrich Drepper 的“每个程序员应该了解的内存知识”中的 Figure 3.27: Core 2 Bandwidth with 2 Threads。(Full version here)。


Skylake-AVX512 具有更大的每核 L2(1MiB 而不是 256k)和更小的每核 L3 (LLC) 切片。它不再具有包容性。它使用网状网络而不是环形总线将核心相互连接。请参阅this AnandTech article(但它在其他页面上的微架构细节中有一些不准确之处,see the comment I left)。

来自Intel® Xeon® Processor Scalable Family Technical Overview

由于 LLC 的非包容性,LLC 中没有缓存行并不表示该行不存在于任何内核的私有缓存中。因此,当它没有在 LLC 中分配时,窥探过滤器用于跟踪内核的 L1 或 MLC 中高速缓存行的位置。在上一代 CPU 上,共享 LLC 自己负责这项任务。

这个“窥探过滤器”只有在它不能有误报时才有用。可以将无效或 RFO (MESI) 发送到没有行副本的核心。当另一个核心请求对它的独占访问时,让一个核心保留一行的副本是不行的。所以它可能是一个包含标签的跟踪器,它知道哪些内核可能有哪一行的副本,但不缓存任何数据。

或者,如果不严格包含所有 L2 / L1 标签,窥探过滤器可能仍然有用。我不是多核/多套接字监听协议方面的专家。我认为同样的监听过滤器也可以帮助过滤套接字之间的监听请求。 (在 Broadwell 和更早的版本中,只有四路和更高版本的 Xeon 具有用于内核间流量的监听过滤器;dual-socket-only Broadwell Xeon and earlier don't filter snoop requests between the two sockets。)


AMD Ryzen uses separate L3 caches for clusters of cores,因此跨多个内核共享的数据必须在每个集群的 L3 中复制。同样重要的是,来自一个集群中的核心的写入需要更长的时间才能被另一个集群中的核心看到,而一致性请求必须通过集群之间的互连。 (类似于多插槽 Intel 系统中的插槽之间,每个 CPU 封装都有自己的 L3。)

因此,这为我们提供了 NUCA(非统一缓存访问),类似于您在多插槽系统中获得的通常的 NUMA(非统一内存访问),其中每个处理器都有一个内置的内存控制器,并且可以访问本地内存比访问附加到另一个套接字的内存要快。


最近的英特尔多插槽系统具有可配置的探听模式,因此理论上您可以调整 NUMA 机制,使其最适合您正在运行的工作负载。请参阅Intel's page about Broadwell-Xeon 获取可用窥探模式的表格和说明。


另一个进步/进化是an adaptive replacement policy in the L3 on IvyBridge and later。当某些数据具有时间局部性但工作集的其他部分要大得多时,这可以减少污染。 (即循环使用标准 LRU 替换的巨型数组将驱逐所有内容,使 L3 缓存仅缓存数组中不会很快再次被触及的数据。自适应替换试图缓解这个问题。)


进一步阅读:

【讨论】:

  • 从安全角度来看,使用经典索引和替换可能会被视为存在问题。替换策略可以进一步细化,可以利用压缩,通过减少容量使用来节省电力,接近使用(NUCA 和从生产者到消费者的数据推送),一致性开销,共享管理(例如,资源竞价和隔离)。低垂的果实可能收获良好,但似乎仍有相当数量的果实剩余。
  • @HadiBrais:Core2 中并非如此;我认为一个核心写入并由另一个核心读取的数据必须通过 DRAM,就像在简单的 MESI 中一样。 (Core2 确实有一个大的共享 L2)。但是,是的,包容性财产并未专门启用这一点。包容性的好处是不必将一致性流量广播到所有核心,因为 L3 标签会告诉您数据可能缓存的位置。 (静默驱逐可能会出现误报,导致无用的 RFO 或无效消息,但不可能出现误报,因此它可以过滤掉大量流量。)
  • @HadiBrais:对,英特尔因为 Nehalem 支持 L3 的一致性流量。我对核心 2 的看法是错误的:它在处理 L2 未命中的 RFO 时速度很慢,但另一个核心可以命中 L2 中的脏数据。 Ulrich Drepper 的内存论文有一些 Core2 基准测试显示,当缓冲区适合 L1d 时,2 个内核之间的复制以 DRAM 速度运行,但并未声称它实际上通过 DRAM。当 1 个核心的写入在另一个核心读取之前强制驱逐到 L2 时,速度要快得多。 lwn.net/Articles/252125这几乎肯定是我(错误地)记得的。
  • @HadiBrais:更新了这个答案。感谢您指出我的主张是虚假的;你说得对,支持一致性 data 不需要包容性。
  • 也证实了here - “由于 LLC 的非包容性,LLC 中没有缓存行并不表示该行不存在于任何内核。因此,当未在 LLC 中分配时,使用窥探过滤器来跟踪内核的 L1 或 MLC 中缓存行的位置。在上一代 CPU 上,共享 LLC 本身负责这个任务。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2013-10-25
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
相关资源
最近更新 更多