assembly - TLB 是否包含在内?

标签 assembly x86 cpu-architecture tlb

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

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

最佳答案

AFAIK,在 Intel SnB 系列上,第二级 TLB 是第一级 iTLB 和 dTLB 的受害者缓存。(我找不到这个来源,也找不到我最初阅读它的 IDK .所以对此持保留态度。我原本以为这是一个众所周知的事实,但这可能是我发明的一个误解!)

我认为这已记录在Intel's optimization manual中的某个地方,但好像不是。

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

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


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

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 缓存是九个,L1i 缓存和 L1d 缓存。它们通过它进行获取,但可以从 L2 逐出行,而无需强制从任一 L1 缓存逐出。)


更多详细信息以及来源链接:


核心 2 有所不同:https://www.realworldtech.com/nehalem/8/说有一个微小的 16 条目 L1dTLB 仅用于加载,并使用 L2 DTLB 进行存储以及 L1dTLB 未命中加载。

Nehalem 改变了这一点(64 条目 DTLB),同时将内存层次结构重新组织为客户端(非服务器)芯片上仍在使用的内容:大型共享包容性 LLC 和 256k 私有(private) L2。 (当然还有通常的分体式 32k L1i/d)Which cache mapping technique is used in intel core i7 processor?

关于assembly - TLB 是否包含在内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61177500/

相关文章:

c - 在 ret2ret 漏洞上执行 shellcode

C代码不使用sizeof确定CPU的大小

assembly - 指令流水线与每个指令的周期之间的链接

assembly - 自修改代码看到 0xCC 字节,但调试器没有显示它?

assembly - Intel 上带偏移量和不带偏移量的内存获取之间的差异

c - 如何让 Watcom C 编译器(wcc)和 WASM 生成相同的 8086 机器码?

assembly - UEFI 机器可以使用 BIOS 中断吗?

cpu-architecture - DMA 如何/如何处理多个并发传输?

无法从 MSR 读回

c - Assembly 中的外部函数声明产生警告