软件在x86上跨页边界预取

jme*_*lfe 6 x86 prefetch tlb nehalem

我的理解是硬件预取永远不会跨越页面边界.我想知道软件预取是否有相同的限制,即我可以使用软件预取来避免未来的TLB未命中.从搜索周围来看,它似乎是可能的,但我在文档中找不到任何确定的内容,因此引用会很好.

我对Nehalem,Sandy Bridge和Westmere特别感兴趣.

ugh*_*fhw 2

根据Intel的优化参考手册,这取决于处理器。从第 7.4.3 节:

在某些情况下,PREFETCH 不会执行数据预取。这些包括:

  • PREFETCH 会导致 DTLB(数据转换后备缓冲区)未命中。这适用于具有与系列 15、型号 0、1 或 2 相对应的 CPUID 签名的 Pentium 4 处理器。PREFETCH 可解决 DTLB 缺失问题,并在具有与系列 15、型号 3 相对应的 CPUID 签名的 Pentium 4 处理器上获取数据。
  • 对指定地址的访问导致错误/异常。

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

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