CPUID 会序列化推测数据缓存吗?

Will CPUID serialize speculative data caching?

我在 Intel Vol.2 的多个指令条目中找到了推测数据缓存过程的描述。

例如,lfence:

Processors are free to fetch and cache data speculatively from regions of system memory that use the WB, WC, and WT memory types. This speculative fetching can occur at any time and is not tied to instruction execution. Thus, it is not ordered with respect to executions of the LFENCE instruction; data can be brought into the caches speculatively just before, during, or after the execution of an LFENCE instruction.

此外,我从在线资源中发现推测缓存也会将数据从较远的缓存移动到较近的缓存。

我想知道最强的序列化指令CPUID是否会阻止推测性缓存越过屏障。

我已经搜索了 Intel Vol.2 中的 CPUID 条目和 Intel Vol.3 中的 "serializing instruction" 部分。但它没有显示任何有关推测数据缓存的信息。

LFENCE 已经足够强大(至少在实践中)可以阻止 CPU 在它之后实际查看加载指令,但是 CPU 可以自由地推测加载 其他个原因。

停止这将需要某种超越障碍的前瞻性以找出要禁用硬件预取的地址。那根本不切实际。 CPUID 或其他序列化指令在停止加载预取方面并不比 LFENCE 强。

CPU总是允许从 WB 和 WT 区域/页面中的内存中推测性地获取。 Intel 的优化手册在他们的一些 CPU 模型中记录了一些关于硬件预取器的东西,所以你实际上可以避免在 CPUID 之前做一些可能触发这种预取的事情。

(WC 是弱排序的不可缓存+写入组合,但在纸面上也允许推测性提取。在现实生活中,这可能只发生在分支预测错误的阴影下,而不是 HW 预取。它通常不可缓存像 WB 和 WT。)


如果您要对真实的 CPU 进行微基准测试,某些微基准测试的技巧是找到不会触发硬件预取的访问模式,或者禁用硬件预取器。


也许理论上你可以有一个 x86 CPU 在指令流中向前看 load/store 指令并推测性地预取它们,与实际 执行 他们(英特尔对 LFENCE 的定义会阻止)。我认为也没有什么可以阻止它在 CPUID 上执行此操作。

大概没人会设计这样的CPU,因为

  1. 不值得晶体管/功率。一旦正常的无序执行可以开始预取就已经足够好了。除了绝对/RIP 相对地址或直接跳转之外,您需要从 OoO 内核中获取寄存器值以获得有用的预取地址。
  2. 看过去的LFENCE / CPUID有悖常理;它们非常罕见,以至于在 Spectre 时代击败超过它们的投机 "execution" 负载是关键的一部分。