3

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

例如,lfence

处理器可以自由地从使用 WB、WC 和 WT 内存类型的系统内存区域推测性地获取和缓存数据。这种推测性的取指可以随时发生,并且与指令执行无关。因此,对于 LFENCE 指令的执行,它没有被排序;数据可以推测性地在 LFENCE 指令执行之前、期间或之后被带入缓存。

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

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

我已经搜索过CPUIDIntel Vol.2 中的条目和 Intel Vol.3 中的“序列化指令”部分。但它没有显示关于推测性数据缓存的任何内容。

4

1 回答 1

3

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

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

CPU总是允许推测性地从 WB 和 WT 区域/页面中的内存中获取。英特尔的优化手册记录了一些有关其某些 CPU 型号中的硬件预取器的内容,因此您实际上可以避免在 CPUID 之前执行可能触发此类预取的操作。

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


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


也许从理论上讲,您可以拥有一个 x86 CPU,它在指令流中查看加载/存储指令并推测性地预取它们,与实际执行它们分开(英特尔对 LFENCE 的定义会阻止)。我也不认为有任何事情会阻止它在 CPUID 上这样做。

可能没有人会设计这样的CPU,因为

  1. 晶体管/电源不值得。只要常规的乱序执行可以达到它就开始预取已经足够好了。除了绝对/ RIP 相对地址或直接跳转之外,您需要来自 OoO 内核的寄存器值才能获得有用的预取地址。
  2. 看过去 LFENCE / CPUID 是不正常的;它们非常罕见,以至于在 Spectre 时代,击败经过它们的投机“执行”负载是重点的一部分。
于 2019-01-15T07:07:14.677 回答