7

L1/L2 缓存包含在 Intel 中,并且 L1/L2 缓存是 8 路关联性,意味着在一组中存在 8 个不同的缓存行。缓存行作为一个整体操作,这意味着如果我想从缓存行中删除几个字节,整个缓存行将被删除,而不仅仅是我想要删除的那些字节。我对吗 ?

现在,我的问题是,无论何时通过其他进程或使用 clflush(手动逐出缓存行/块)从缓存中删除/逐出一组缓存行,系统是否会在某处存储该缓存行的逐出数据(在任何缓冲区、寄存器等中),以便下次它可以从该位置加载数据以减少延迟,与从主存储器或更高级别的缓存加载数据相比,或者总是简单地使缓存中的数据无效并且下次从下一个更高级别加载数据。

任何建议或文章的任何链接都将受到高度赞赏。提前致谢。

4

2 回答 2

6

L1/L2 不一定包含在内,只有最后一级缓存是已知的,在 i7 上是 L3。你说的对,缓存行是基本的缓存元素,你必须抛出一个完整的缓存行才能填充一个新的缓存行(或者当单行无效时)。您可以在此处阅读更多相关信息 - http://www.tomshardware.com/reviews/Intel-i7-nehalem-cpu,2041-10.html

当一条线被删除时,所采取的行动取决于它的 MESI 状态(MESI 及其衍生物是缓存一致性维护的协议)。如果该行被修改,(“M”),那么数据必须“写回”到下一级缓存(如果未命中,它可能会在那里分配,或者“直写”到下一级 - 取决于在缓存维护的策略上)。请注意,当您到达最后一级缓存时,您必须点击它,因为它是包容性的。当从最后一级缓存中逐出一行时 - 它必须被写入内存。无论哪种方式,未能写回修改的行都会导致失去一致性,这很可能会导致错误执行。

如果该行未被修改(无效、独占或共享),CPU 可能会静默丢弃它而无需写回,从而节省带宽。顺便说一句,更复杂的缓存协议(如 MESIF 或 MOESI)中还有其他几种状态。

您可以通过谷歌搜索“缓存一致性协议”找到很多解释。如果喜欢更扎实的资料,可以参考任何 CPU 架构或缓存设计教科书,我个人推荐 Hennessy&Patterson 的《Computer Architecture, aquantitative approach》,里面有一整章讲缓存性能,不过这里有点跑题了。

小更新:从 Skylake 开始,一些 CPU(服务器段)不再具有包容性 L3,而是非包容性(以支持增加的 L2)。这意味着干净的行也可能在 L2 老化时被写回,因为 L3 通常不保存它们的副本。

更多详情:https ://www.anandtech.com/show/11550/the-intel-skylakex-review-core-i9-7900x-i7-7820x-and-i7-7800x-tested/4

于 2013-10-17T15:39:06.237 回答
3

L1/L2 缓存包含在 Intel 中

就缓存包容性而言,英特尔 x86 处理器属于以下类别之一:

  • 缓存分为三级。L3 包括 L2 和 L1。L2 是L1的九个(不包含,不排除)。此类别包括以下所有处理器:(1) 实现 Core 微架构的所有客户端处理器,包括 Rocket Lake,但专为客户端细分市场设计的 Core X 和 Xeon W 处理器系列除外。这还包括面向客户端的 Xeon W-10000 系列。(2) 实现核心微架构的所有服务器处理器,包括 BDX,以及 (3) 所有 Xeon E3、Xeon E 和 Xeon W-1200 处理器。
  • 有两级缓存。L2 是 L1 的九个。所有 Atom 处理器(包括 Tremont)都属于这一类。所有旧的英特尔处理器(具有两个缓存级别)也属于这里。
  • 有两级缓存。L2 包括 L1D 和 L1I 的 NINE。KNL 和 KNM 处理器属于这里。KNC 和 KNF 的可用信息表明 L2 包含 L1,尽管这可能不准确,并且 L2 也可能仅包含这些处理器上的 L1D。MCDRAM 见下文。
  • 缓存分为三级。L3 和 L2 都是九。此类别包括以下所有处理器:(1) 所有具有三级缓存的 Pentium 4 处理器,(2) 所有代 Xeon SP 处理器,(3) Xeon D-2100、Skylake Core X 系列处理器、Skylake Xeon W 系列处理器,它们都使用 SKX 非内核而不是 SKL 非内核,以及 (4) All Tiger Lake 处理器。
  • Lakefield 处理器具有三级缓存层次结构。4 个 Tremont 内核共享一个 NINE L2,而 Sunny Cove 内核有自己的 9 个 L2。所有 5 个内核共享一个 LLC,该 LLC 可以配置为包容性或 NINE。

一些处理器具有 L4 缓存或内存端缓存。这些缓存是九个。在 KNL 和 KNM 中,如果 MCDRAM 完全或部分配置为在缓存模式下运行,它会被修改为包含 L2(因此也包含 L1),这意味着包含性仅适用于 L2 中的脏行(处于 M 一致性状态) . 在支持 Optane DIMM 的 CSL 处理器上,如果 PMEM DIMM 完全或部分配置为在缓存模式下运行,则 DRAM DIMM 的工作方式如下:

Cascade Lake 处理器使用一种新颖的缓存管理方案,结合使用包含和非包含 DRAM 缓存来减少写入的 DRAM 带宽开销,同时还消除了在从 DRAM 缓存中逐出包含行时管理处理器缓存无效的复杂性。

根据Cascade Lake:下一代英特尔至强可扩展处理器

KNL/KNM 中的 MCDRAM 缓存和 CSL 中的 DRAM 缓存不属于三个传统包容性类别中的任何一个,即包容性、独占性和 NINE。我认为我们可以将它们描述为具有“混合包容性”。


AMD 处理器:

  • 禅家:L2包容,L3是九。
  • 推土机系列:L2 为 NINE,L3 为 NINE。
  • 捷豹和彪马:L2 是包容性的。没有L3。
  • K10 和 Fusion:L2 是独家的。没有L3。
  • 山猫:我不知道L2。没有L3。
  • K7(型号 3 及更高型号)和 K8:L2 是专有的。没有L3。
  • K7(型号 1 和 2)及更早版本:L2 包含在内。没有L3。

现有的 AMD 处理器没有 L4 缓存或 L3 之外的内存端缓存。

威盛处理器:

  • Nano C 和 Eden C:我不知道 L2。没有L3。
  • 所有较旧的处理器:L2 是专有的。没有L3。

这涵盖了所有当前的威盛处理器。


而 L1 / L2 缓存是 8 路关联性,意味着在一个集合中存在 8 个不同的缓存行。

大多数英特尔处理器都是如此。唯一的例外是 NetBurst 微体系结构,其中单个 L2 方式拥有两个相邻的高速缓存行,统称为扇区。

8 的关联性是典型的,但具有不同关联性的情况并不少见。例如,Sunny Cove 中的 L1D 是 12 路关联的。请参阅:Ice Lake 的 48KiB L1 数据缓存的索引如何工作?.

缓存行作为一个整体操作,这意味着如果我想从缓存行中删除几个字节,则整个缓存行将被删除,而不仅仅是我想要删除的那些字节。我对吗 ?

是的,这是由于与每个缓存级别的每个缓存条目相关联的一致性状态的限制。高速缓存行的所有字节只有一种状态。

系统是否将该缓存行的逐出数据存储在某处(在任何缓冲区、寄存器等中),以便下次它可以从该位置加载数据以减少延迟

有几个因素会影响此决定:(1) 行是否脏,(2) 较高编号的缓存级别的包容性属性,如果有的话,(3) 是否预测该行在不久的将来会被访问, 和 (4) 如果我没记错的话,如果一行的内存类型在它驻留在缓存中时从可缓存变为不可缓存,则无论前面的因素如何,它都会被逐出并且不会缓存在任何其他级别。

因此,适用于所有处理器的懒惰答案是“也许”。

于 2020-01-21T18:20:40.163 回答