x86 - 在 x86 上跨页面边界的软件预取

标签 x86 tlb prefetch nehalem

我的理解是硬件预取永远不会跨越页面边界。我想知道软件预取是否具有相同的限制,即我可以使用软件预取来避免 future 的 TLB 未命中。通过四处搜索,这似乎是可能的,但我在文档中找不到任何明确的内容,因此引用会很好。

我对 Nehalem、Sandy Bridge 和 Westmere 特别感兴趣。

最佳答案

根据英特尔的 Optimization Reference Manual ,这取决于处理器。来自第 7.4.3 节:

There are cases where a PREFETCH will not perform the data prefetch. These include:

  • PREFETCH causes a DTLB (Data Translation Lookaside Buffer) miss. This applies to Pentium 4 processors with CPUID signature corresponding to family 15, model 0, 1, or 2. PREFETCH resolves DTLB misses and fetches data on Pentium 4 processors with CPUID signature corresponding to family 15, model 3.
  • An access to the specified address that causes a fault/exception.


软件预取可能会也可能不会避免 TLB 未命中,具体取决于处理器。如果它会导致页面错误,它将不会获取数据。

如果您想确保避免 TLB 未命中,您可以执行虚拟读取来加载数据而不是预取指令。这可能会导致页面错误交换页面,这可能是好的也可能是坏的,具体取决于您的用例。

关于x86 - 在 x86 上跨页面边界的软件预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782182/

相关文章:

java - 内存屏障和 TLB

architecture - 如何导致用户进程的 TLB 抖动?

linux - Linux 如何使用 PCID 的值?

Android:加载数据然后通知 Activity ?还记录了一个失败的方法!

c++ - _mm_prefetch 是异步的吗?分析显示有很多周期

linux - 使用汇编在 Linux 终端中清除屏幕?

assembly - 为什么带有 jmp 指令的 shellcode 可以工作,而标签为什么不能在 C 包装器内工作?

assembly - IA-32 中的段选择器

assembly - 为什么 "push ebp"会改变 ebp 的值?

google-chrome - Chrome 预取域中的页面