Som*_*ame 2 x86 assembly cpu-architecture tlb
TLB 层次结构是否包含在现代 x86 CPU(例如 Skylake 或其他 Lakes)上?
例如,prefetchtn将数据带到级别缓存n + 1以及 DTLB 中的相应 TLB 条目。它也会包含在 STLB 中吗?
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 缓存中逐出。)
更多详细信息与来源链接:
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-entry L1dTLB,仅用于加载,并使用 L2 DTLB 进行存储以及 L1dTLB-miss 加载。
Nehalem 改变了这一点(64 条目 DTLB),同时将内存层次结构重新组织为客户端(非服务器)芯片上仍在使用的内容:大型共享包容性 LLC 和 256k 私有 L2。(当然仍然是通常的拆分 32k L1i/d) intel core i7 处理器中使用了哪种缓存映射技术?