TLB 是否包括在内?

Som*_*ame 2 x86 assembly cpu-architecture tlb

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

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

Pet*_*des 5

AFAIK,在英特尔 SnB 系列上,二级 TLB 是一级 iTLB 和 dTLB 的受害者缓存。 (我找不到这个的来源和我最初阅读它的 IDK。所以谨慎对待。我原本认为这是一个众所周知的事实,但它可能是我发明的一个误解!)

我认为这在Intel 的优化手册中的某处有记录,但似乎没有。

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

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


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

我认为 L2 预取可能对否则会错过 DRAM 的代码非常有效。是的,您不加热 ITLB 或 L1I,而是加热 L2 和 STLB,因此您在第一次执行时需要花费十几个周期。

这工作了NINE STLB; 它实际上不必是inclusive,只是不是独占或受害者缓存。(例如,L2 缓存是 NINE wrt。L1i 缓存和 L1d 缓存。它们通过它获取,但是可以从 L2 中逐出行,而不会强制从任一 L1 缓存中逐出。)


更多详细信息与来源链接:


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

Nehalem 改变了这一点(64 条目 DTLB),同时将内存层次结构重新组织为客户端(非服务器)芯片上仍在使用的内容:大型共享包容性 LLC 和 256k 私有 L2。(当然仍然是通常的拆分 32k L1i/d) intel core i7 处理器中使用了哪种缓存映射技术?

  • @SomeName:我还没有找到任何东西;更新了我的答案以添加警告。请注意,STLB 不必“包含”“prefetcht1”才能工作;九号也可以。(参见更新的答案)。 (2认同)