【问题标题】:Optimization of fenced memory stores on x86 CPU优化 x86 CPU 上的隔离内存存储
【发布时间】:2018-08-19 05:29:38
【问题描述】:
mov 0x0ff, 10
sfence 
mov 0x0ff, 12
sfence

x86-CPU 是否可以这样执行:

 mov 0x0ff, 12
 sfence

?

【问题讨论】:

  • 两个sfence 指令都是多余的(相关:Does SFENCE prevent the Store Buffer hiding changes from MESI?)。但即使没有它们,我 认为 有时另一个线程也可以观察到 10。不过,有一些证据表明在存储提交到 L1D 之前存储队列中的合并。 (但我找不到关于那个的 SO 答案或 cmets)。
  • 找到它:Unexpectedly poor and weirdly bimodal performance for store loop on Intel Skylake 有一些证据表明同一缓存行的相邻存储在存储缓冲区中合并/合并并作为一个更新提交。如果在 same 位置的商店发生这种情况,那么 10 可能永远不会提交给 L1d。我不知道sfence 是否会阻止这种情况;我认为在纸面上它不必这样做,但它可能会阻止合并实际 CPU。
  • @PeterCordes sfence 耗尽存储缓冲区(根据英特尔),因此它应该防止合并。订购是多余的,但我认为这不是为了提高知名度。
  • @eugene - sfence 不是无操作的,因为它隔离了通常不会相对于彼此或常规存储进行排序的非临时存储。
  • @margaret - 我还阅读了英特尔文档,他们将sfence 列为耗尽存储缓冲区,但我发现很难相信(至少在之前同步耗尽存储缓冲区的意义上)退休),因为它似乎暗示 sfence; lfence 对 mfence 来说是 eauivlant 但英特尔明确表示它不是,而且它执行得相当快,所以作为一个实际问题,我认为它不是等效的。我觉得这种语言是从早期遗留下来的,不能依赖,尽管我承认不清楚。

标签: assembly x86 memory-barriers


【解决方案1】:

是的,某些 CPU 可能会按照您的建议执行它。

即使你在那里设置了一个更坚固的栅栏,比如mfence,或者使用锁定指令,当然也不能保证第一次写入不会被优化掉。

这通常是正确的:排序和围栏规则基本上告诉您哪些执行是不允许的,因此保证永远不会发生,但考虑到允许执行的互补集 em> 发生通常不能保证任何特定的执行都可以实际观察到。

也就是说,我很确定在当前的 x86 芯片上,您始终能够观察到偶尔出现的 10 值(即使完全省略了栅栏),尽管任何存储缓冲区合并,因为您偶尔会收到中断两店之间,让你读10。

不过,这并不能保证——我们当然可以想象像 Denver 或 Transmeta 这样的动态优化 x86 架构可以压缩上述序列,同时移除栅栏和第一家商店,使 20 成为唯一可观察到的值。

【讨论】:

  • @Gilgamesz - mfence 不会导致上下文切换,我认为我没有暗示这一点。我只是说,即使有一个“更重”的栅栏,也不能保证在所有过去、现在和未来的 x86 芯片上都观察到 10。当然,如果 mfence 需要很多周期,那么上下文切换可能更可能靠近 mfence 指令,但我的回答中没有任何内容依赖于此,我并不完全关注您对这种效果的讨论。跨度>
  • 或者像 QEMU 这样的动态重新编译,在 ARM 或 PowerPC 或具有类似内存模型的 SPARC 上运行 x86 代码。或者在运行二进制到二进制优化器之后。
  • @Gilgamesz - CPU 可以像编译器重新组织和消除各种代码位的方式一样移除栅栏,只要它保留代码的保证语义即可。大多数 CPU 并没有做太多这种类型的“优化”,因为它们实际上并没有编译阶段(但即使那样你也可以看到这些东西的提示,例如,通过 mov 消除、在循环缓冲区中展开等) .但是,已经出现了二进制重新编译 x86 CPU,例如 nVidia 的 Denver 和 Transmeta CPU,它们确实从 x86 机器代码编译成另一个特定于 CPU 的指令集。
  • 这样的 CPU 肯定会进行各种“类似编译器”的优化。注意去掉第二个栅栏需要分析周围的代码:sfences对于你展示的stores是多余的,但是如果在这个segment之前/之后有NTstores可能会有影响,所以可以经常,但并不总是被删除。另请参阅this comment
  • 即使有栅栏,也不能保证在序列的任何一次执行中,核心在提交1012 之间会丢失缓存行给读取器。我想在这个核心有足够多的核心向 RFO 发送垃圾邮件,你很有可能做到这一点。但是,有趣的一点是,中断可能会破坏存储合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多