Ice Lake 的 48KiB L1 数据缓存的索引是如何工作的?

How does the indexing of the Ice Lake's 48KiB L1 data cache work?

英特尔手动优化(2019 年 9 月修订)显示了 Ice Lake 微架构的 48 KiB 8 路关联 L1 数据缓存。

1 软件可见 latency/bandwidth 会因访问模式和其他因素而异。

这让我感到困惑,因为:

总而言之,缓存的处理成本似乎更高,但延迟仅略有增加(如果有的话,取决于英特尔对该数字的确切含义)。

凭借一点创造力,我仍然可以想象出一种快速索引 96 个集合的方法,但第二点对我来说似乎是一个重要的突破性变化。

我错过了什么?

优化手册有误。

根据CPUID指令,结合律为12(在Core i5-1035G1上)。另见 uops.info/cache.html and en.wikichip.org/wiki/intel/microarchitectures/ice_lake_(client)

这意味着有64组,与之前的微架构相同。

优化手册和datasheet of the processor family (Section 2.4.2) mention that the L1 data cache is 8-way associative. Another source is InstLatx64, which provides cpuid dumps for many processors including Ice Lake processors. Take for example the dump for 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 处理器的规格更新文档,您可以找到 here。那里记录了两个 cpuid 错误:

CPUID TLB Information is Inaccurate

我已经在 的回答中讨论过这个问题。第二个错误是:

CPUID L2 Cache Information May Be Inaccurate

这与您的问题无关。

规范更新文档提到一些 cpuid 错误这一事实强烈表明来自 cpuid 叶 0x4 的信息已经过英特尔验证并且是准确的。所以在这种情况下,优化手册(和数据表)可能是错误的。