处理器系列的优化手册和数据表(第 2.4.2 节)都提到 L1 数据缓存是 8 路关联的。另一个来源是InstLatx64
,它为包括 Ice Lake 处理器在内的许多处理器提供cpuid
转储。以i7-1065G7的转储为例
CPUID 00000004:1C004121-02C0003F-0000003F-00000000 [SL 00]
缓存信息可以在cpuid
叶子 0x4 中找到。英特尔 SDM 第 2 卷讨论了如何解码这些字节。EBX 的第 31 - 22 位(左起第二个)表示路数减一。这些二进制位是 1011,十进制是 11。所以cpuid
说有12种方法。我们可以从这里获得的其他信息是,L1 数据缓存大小为 48KB,缓存行大小为 64 字节,并使用简单寻址方案。因此根据cpuid
信息,地址的第 11-6 位表示缓存集索引。
那么哪一个是对的呢?优化手册可能是错误的(这不是第一次),但cpuid
转储也可能是错误的(这也不是第一次)。好吧,两者都可能是错误的,但从历史上看,这种可能性要小得多。此处cpuid
讨论了手册和信息之间存在差异的其他示例,因此我们知道两个来源中都存在错误。此外,我不知道有任何其他英特尔消息来源提到 L1D 中的方式数量。当然,非英特尔来源也可能是错误的。
有 8 路和 96 组将导致不寻常的设计,并且在优化手册中仅提及一个数字就不太可能发生(尽管这并不一定意味着缓存必须有 12 路)。这本身就使手册在这里更容易出错。
幸运的是,英特尔确实在规格更新文档中记录了其处理器中的实现错误。我们可以查看 Ice Lake 处理器的规格更新文档,您可以在此处找到该文档。那里记录了两个cpuid
错误:
CPUID TLB 信息不准确
我已经在关于从 Intel CPUID 结果中理解 TLB 的回答中讨论了这个问题。第二个错误是:
CPUID L2 缓存信息可能不准确
这与您的问题无关。
规范更新文档提到了一些cpuid
错误这一事实强烈表明来自cpuid
叶子 0x4 的信息已经过英特尔验证并且是准确的。因此,在这种情况下,优化手册(和数据表)可能是错误的。