优化 x86 上的围栏内存存储 CPU

Optimization of fenced memory stores on x86 CPU

mov 0x0ff, 10
sfence 
mov 0x0ff, 12
sfence

它能被 x86-CPU 执行为:

 mov 0x0ff, 12
 sfence

?

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

即使您在其中放置了像 mfence 这样更坚固的栅栏,或者使用锁定指令,也肯定没有 保证 不会优化第一次写入。

这在一般情况下是正确的:排序和防护规则基本上告诉您哪些执行是 不允许的 ,因此保证永远不会发生,但随后考虑补充执行集 允许 发生通常不能保证可以实际观察到任何特定的执行。

就是说,我很确定在当前的 x86 芯片上您总是能够观察到偶尔的 10 值(即使完全省略了栅栏),尽管有任何存储缓冲区合并,因为您偶尔会得到两个存储之间的中断,允许您读取 10。

仍然不能保证 - 可以肯定地想象一个动态优化的 x86 架构,如 Denver 或 Transmeta 可以压缩上述序列,删除两个栅栏和第一个商店,使 20 成为唯一可观察的值。