【问题标题】:Software prefetching across page boundary on x86x86 上跨页面边界的软件预取
【发布时间】:2013-01-24 18:52:16
【问题描述】:

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

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

【问题讨论】:

  • 更新:IvyBridge 确实会跨页面边界进行硬件预取。 stackoverflow.com/a/20758769/224132。这是 IvB 中的一项新功能,从我读过的其他内容来看,我认为说 SnB 和更早的英特尔不会预取到下一页是准确的。不过,推测性 TLB 加载是一件事情,至少在由加载/存储指令的推测性执行触发时是这样。

标签: x86 tlb prefetch nehalem


【解决方案1】:

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

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

  • PREFETCH 导致 DTLB(数据转换后备缓冲区)未命中。这适用于奔腾 4 CPUID 签名对应于系列 15、型号 0、1 或 2 的处理器。 PREFETCH 使用 CPUID 签名解决 DTLB 未命中并在 Pentium 4 处理器上获取数据 对应于家庭 15,型号 3。
  • 对导致故障/异常的指定地址的访问。

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

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

【讨论】:

  • OP提到的CPU家族不是奔腾4级的CPU。
  • @didierc 我不知道,但我直接从英特尔的手册中复制了它,wikipedia 将除型号 0 之外的所有型号都列为 Pentium 4。
  • 好指针。 OP 对最新一代的 ia64 CPU(intel i5 和 i7 类,afaik)感兴趣。我只是想帮助缩小你的答案。如果听起来很刺耳,那我的错,这不是我的本意。
  • 是的,我找不到我提到的后代的任何东西。我认为虚拟读取比异步预取更昂贵,尽管显然这也有一些开销。
  • @jmetcalfe:是的,虚拟读取在完成之前不能退出,即使没有使用结果。由于 ROB(重新排序缓冲区)在 Sandybridge (realworldtech.com/sandy-bridge/5) 中只有约 168 个条目,因此在阻止新指令进入 out-of-订购部分核心。页面遍历 + 缓存未命中可能需要 很多 比这更长的时间。 prefetch 指令应该比虚拟读取更好地触发页面遍历。
【解决方案2】:

在现代处理器(Nehalem、Sandy Bridge 和 Westmere)中,软件预取确实会触发 TLB 查找。

来自英特尔优化指南:(第 7.3.3 节)

在较旧的微架构中,PREFETCH 会导致数据转换 后备缓冲区 (DTLB) 未命中将被丢弃。在基于处理器的 Nehalem、Westmere、Sandy Bridge 和更新的微架构,英特尔 Core 2 处理器和 Intel Atom 处理器,PREFETCH 导致 DTLB 可以跨页面边界获取未命中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2018-05-21
    • 2023-01-03
    • 2018-03-19
    • 2013-02-14
    相关资源
    最近更新 更多