L1/L2缓存在Intel处理器中具有包容性。就缓存包容性而言,Intel x86处理器分为以下几类:
1. 三级缓存:L3包含L2和L1。L2与L1是非包容性、非排他性的(NINE策略)。此类处理器包括以下处理器:(1)所有实现Core微架构的客户端处理器,包括Rocket Lake及以下,但不包括针对客户端市场的Core X和Xeon W处理器系列。这还包括面向客户端市场的Xeon W-10000系列。(2)所有实现Core微架构的服务器处理器,包括BDX及以下,以及(3)所有Xeon E3,Xeon E和Xeon W-1200处理器。
2. 两级缓存:L2与L1是非包容性、非排他性的(NINE策略)。所有Atom处理器(包括Tremont)属于此类。所有旧的Intel处理器(仅有两个缓存级别)也属于此类。
3. 两级缓存:L2包容L1D,且L1I是非包容性、非排他性的(NINE策略)。KNL和KNM处理器属于此类。对于KNC和KNF可用的信息显示,L2包容L1,尽管这可能不准确,L2在这些处理器上也可能仅包容L1D。有关MCDRAM的详细信息请参见下文。
4. 三级缓存:L3和L2都是非包容性、非排他性的(NINE策略)。此类处理器包括以下处理器:(1)所有具有三个缓存级别的Pentium 4处理器,(2)所有Xeon SP处理器的各代,(3)Xeon D-2100,Skylake Core X系列处理器,Skylake Xeon W系列处理器,它们都使用SKX未核心而不是SKL未核心,以及(4)所有Tiger Lake处理器。
5. Lakefield处理器具有三层缓存层次结构。4个Tremont内核共享一个NINE L2,而Sunny Cove内核有自己的NINE L2。这5个内核都共享一个LLC,可以配置为包容性或非包容性。
某些处理器具有L4缓存或内存侧缓存。这些缓存是非包容性的。在KNL和KNM中,如果MCDRAM完全或部分配置为运行在缓存模式下,则被修改的L2(因此也是L1)具有包容性,这意味着包容性仅适用于L2中的脏行(处于M一致状态)。对于支持Optane DIMM的CSL处理器,如果PMEM DIMM完全或部分配置为以缓存模式运行,则DRAM DIMM的工作方式如下:
根据Cascade Lake: Next Generation Intel Xeon Scalable Processor,Cascade Lake处理器使用了一种新颖的缓存管理方案,其中使用包含和非包含DRAM缓存的组合来减少DRAM写入时的带宽开销,同时消除在DRAM缓存中包含行从处理器缓存中逐出时管理失效的复杂性。
KNL / KNM中的MCDRAM缓存和CSL中的DRAM缓存不属于包容性、独占性和NINE的任何传统包容性类别。我认为我们可以将它们描述为具有“混合包容性”。
AMD处理器:
- Zen家族:L2具有包容性,L3具有NINE。
- Bulldozer家族:L2具有NINE,L3也是NINE。
- Jaguar和Puma:L2具有包容性。没有L3。
- K10和Fusion:L2具有独占性。没有L3。
- Bobcat:我不确定L2。没有L3。
- K7(第3个型号及以上)和K8:L2具有独占性。没有L3。
- K7(第1个和第2个型号)以及更早的型号:L2具有包容性。没有L3。
没有现有的AMD处理器具有L4高速缓存或超出L3的内存侧缓存。
VIA处理器:
- Nano C和Eden C:我不确定L2。没有L3。
- 所有旧处理器:L2具有独占性。没有L3。
这涵盖了所有当前的VIA处理器。
大多数英特尔处理器的L1 / L2缓存都是8路关联,这意味着在一个集合中存在8个不同的高速缓存线路。
唯一的例外是NetBurst微体系结构,其中单个L2路包含两个相邻的高速缓存线路,称为扇区。
虽然8路关联是典型的,但有不同的关联性并不罕见。例如,Sunny Cove中的L1D是12路关联。请参阅:如何使用Ice Lake的48KiB L1数据缓存的索引?
高速缓存行作为整体操作,这意味着如果我想从高速缓存行中删除几个字节,则整个高速缓存行将被删除,而不是仅删除我想要删除的那些字节。
这是由于每个缓存级别的每个缓存条目关联的一致性状态存在限制,一个缓存行的所有字节只有一个状态。
系统是否将该缓存行驱逐的数据存储在某个地方(任何缓冲区、寄存器等)以便下次可以从那个地方加载数据以减少延迟?
有几个因素影响这个决定:(1)缓存行是否脏数据,(2)更高级别缓存的包容性属性(如果有),(3)缓存行是否预测在不久的将来访问,以及(4)如果我没记错,如果一行内存类型从可缓存变为不可缓存,它将被驱逐,并且不会在任何其他级别进行缓存,无论前面的因素如何。
因此,一个适用于所有处理器的懒惰答案是“可能”。