我的理解是硬件预取永远不会跨越页面边界。我想知道软件预取是否具有相同的限制,即我可以使用软件预取来避免 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/