【发布时间】:2020-07-25 09:34:18
【问题描述】:
现代 x86 CPU(例如 Skylake 或其他 Lakes)是否包含 TLB 层次结构?
例如,prefetchtn 将数据带到级别缓存 n + 1 以及 DTLB 中的相应 TLB 条目。是否也会包含在 STLB 中?
【问题讨论】:
标签: assembly x86 cpu-architecture tlb
现代 x86 CPU(例如 Skylake 或其他 Lakes)是否包含 TLB 层次结构?
例如,prefetchtn 将数据带到级别缓存 n + 1 以及 DTLB 中的相应 TLB 条目。是否也会包含在 STLB 中?
【问题讨论】:
标签: assembly x86 cpu-architecture tlb
AFAIK,在英特尔 SnB 系列 2 级 TLB 上是一级 iTLB 和 dTLB 的受害者缓存。(我在最初阅读它的地方找不到这个和 IDK 的来源. 所以对此持保留态度。我原本以为这是一个众所周知的事实,但它可能是我发明的一个误解!)
我认为这在 Intel's optimization manual 的某处有记录,但似乎没有。
如果这是正确的,那么在条目从 dTLB 中逐出后一段时间后,您将获得与 STLB 相同的好处,但不会在重复条目上浪费空间。
因此,例如,如果您将代码和数据保存在同一页面中,则在执行代码时可能会出现 iTLB 未命中,然后在 STLB 中也未命中的 dTLB 未命中,如果该代码从同一页。 (这是因为我们不将只读数据与 x86 上的代码保存在同一页面中;它没有代码大小优势,并且由于在两个 TLB 中具有相同的页面而浪费了 iTLB + dTLB 覆盖范围。)
但也许我错了; Travis (@BeeOnRope) 建议使用数据预取来降低 iTLB 未命中成本;他假设 page walker 填充了 STLB 和 dTLB 中的条目。 (在 Core 2(?) 及更高版本上,TLB-miss software-prefetch 可以触发 walk 而不是放弃。)
我认为 L2 预取可能对否则会错过 DRAM 的代码非常有效。是的,您不会加热 ITLB 或 L1I,但会加热 L2 和 STLB,因此第一次执行需要十几个周期。
这适用于NINE STLB;它实际上不必是包含,只是不是独占或受害者缓存。 (例如,L2 缓存是 NINE wrt。L1i 缓存和 L1d 缓存。它们通过它获取,但是可以从 L2 中逐出行,而无需从任一 L1 缓存中强制逐出。)
更多详情及来源链接:
https://en.wikichip.org/wiki/intel/microarchitectures/skylake_(client)#Memory_Hierarchy
https://www.7-cpu.com/cpu/Skylake.html 有计时结果和 TLB 大小,但不是我们要查找的信息。
Core 2 不同:https://www.realworldtech.com/nehalem/8/ 说它有一个微型 16 条目 L1dTLB,仅用于加载,并使用 L2 DTLB 进行存储以及 L1dTLB 未命中加载。
Nehalem 改变了这一点(64 项 DTLB),并将内存层次结构重新组织为客户端(非服务器)芯片上仍在使用的内容:大型共享包容性 LLC 和 256k 私有 L2。 (当然仍然是通常的拆分 32k L1i/d)Which cache mapping technique is used in intel core i7 processor?
【讨论】:
victim 和inclusive 没有给出任何与tlb 相关的结果。您是如何发现 TLB 行为的?是个人研究吗?实际上,我发现了一个与主题无关的新事物——LLC 是非包容性的,因为 Skylake 是中级缓存的受害者。
prefetcht1 将代码预取到 L2。有a topic on Intel official forum 正是描述了这一点。以下是 Travis D. 所写的内容: 我认为 L2 预取对于否则会错过 DRAM 的代码可能非常有效。是的,您不会加热 ITLB 或 L1I,但会加热 L2 和 STLB,因此第一次执行需要十几个周期。
prefetcht1 工作;九也可以。 (见更新的答案)。