TLB是否包容?

Is TLB inclusive?

现代 x86 CPU(例如 Skylake 或其他 Lakes)是否包含 TLB 层次结构?

例如,prefetchtn 将数据带到级别缓存 n + 1 以及 DTLB 中相应的 TLB 条目。它也会包含在STLB中吗?

AFAIK,在英特尔 SnB 系列上,二级 TLB 是一级 iTLB 和 dTLB 的受害者缓存。(我找不到这个和 IDK 的来源我最初是在哪里读到的。所以对此持保留态度。我原本认为这是一个众所周知的事实,但这可能是我杜撰的一个误解!)

我认为这在 Intel's optimization manual 的某处有记录,但似乎没有。

如果这是正确的,那么在条目被从 dTLB 中逐出一段时间后,您基本上会得到与在 STLB 中命中相同的好处,但不会在重复条目上浪费 space。

因此,例如,如果您将代码和数据保存在同一页中,则在执行代码时可能会出现 iTLB 未命中,然后在 STLB 中也会出现 dTLB 未命中,并在加载该代码时执行另一页遍历来自同一页面的数据。 (这就是我们不将只读数据与 x86 上的代码保存在同一页中的原因;它没有代码大小优势,并且通过在两个 TLB 中使用相同的页来浪费 iTLB + dTLB 覆盖范围。)


但也许我错了; Travis (@BeeOnRope) 建议使用数据预取来降低 iTLB 未命中成本;他假设页面浏览器填充了 STLB 和 dTLB 中的一个条目。 (在 Core 2(?) 及更高版本上,TLB-miss 软件预取可以触发遍历而不是放弃。)

I think L2 prefetching is likely to be very effective for code that would otherwise miss to DRAM. Yes, you don't warm the ITLB or the L1I, but you warm the L2 and STLB, so you are taking something like a dozen cycles for the the first execution.

这适用于 NINE STLB;它实际上不必 包含 ,只是不是排他性的或受害者缓存。 (例如 L2 缓存是 9 wrt。L1i 缓存和 L1d 缓存。它们通过它获取,但是可以从 L2 中逐出行而不强制从任一 L1 缓存中逐出。)


带有源链接的更多详细信息:


Core 2 不同:https://www.realworldtech.com/nehalem/8/ 说它有一个很小的 ​​16 条目 L1dTLB 仅用于加载,并使用 L2 DTLB 进行存储以及 L1dTLB 缺失加载。

Nehalem 更改了(64 条目 DTLB),同时将内存层次结构重新组织为仍在客户端(非服务器)芯片上使用的内容:大型共享包容性 LLC 和 256k 私有 L2。 (当然还有通常的split 32kL1i/d)