我的理解是硬件预取永远不会跨越页面边界。我想知道软件预取是否具有相同的限制,即我是否可以使用软件预取来避免未来的TLB未命中。从搜索周围看来,它似乎是可能的,但我在文档中找不到任何确定的内容,因此引用会很好。
我对Nehalem,Sandy Bridge和Westmere特别感兴趣。
答案 0 :(得分:2)
根据英特尔的Optimization Reference Manual,它取决于处理器。从第7.4.3节:
有些情况下PREFETCH不会执行数据预取。其中包括:
- PREFETCH导致DTLB(数据转换后备缓冲区)未命中。这适用于奔腾4 具有CPUID签名的处理器对应于系列15,型号0,1或2. PREFETCH 解决了DTLB未命中并在具有CPUID签名的Pentium 4处理器上获取数据 对应于15系列,型号3。
- 访问导致错误/异常的指定地址。
软件预取可能会也可能不会避免TLB未命中,具体取决于处理器。如果数据导致页面错误,它将不会获取数据。
如果你想确保避免TLB未命中,你可以进行虚拟读取来加载数据而不是预取指令。这可能会导致页面错误在页面中交换,这可能是好的也可能是坏的,具体取决于您的用例。
答案 1 :(得分:2)
在现代处理器(Nehalem,Sandy Bridge和Westmere)中,软件预取确实会触发TLB查找。
来自英特尔优化指南:(第7.3.3节)
在较旧的微体系结构中,PREFETCH导致数据转换 Lookaside Buffer(DTLB)miss将被删除。在基于的处理器中 Nehalem,Westmere,Sandy Bridge和更新的微型架构,英特尔 Core 2处理器和Intel Atom处理器,PREFETCH导致DTLB 可以跨页边界获取miss。