好的,我已经阅读了以下关于 x86 CPU 篱笆(LFENCE
,SFENCE
和 MFENCE
)的来自 SO 的 Qs:
以及:
老实说,我还是不太确定什么时候需要篱笆。我试图从移除完全开放的锁的角度来理解,并试图通过围栏使用更细粒度的锁,以尽量减少延迟。
首先,有两个具体的问题我不明白:
有时在进行存储时,CPU 将写入其存储缓冲区而不是 L1缓存。然而,我不明白的条款,一个 CPU 将这样做?
CPU2可能希望加载已写入 CPU1存储缓冲区的值。据我所知,问题在于 CPU2无法在 CPU1的存储缓冲区中看到新值。为什么 MESI 协议不能将刷新存储缓冲区作为其协议的一部分?
更一般地说,是否有人可以尝试描述整个场景,并帮助解释什么时候 LFENCE
/MFENCE
和 SFENCE
指令是必需的?
注意: 围绕这个主题阅读的一个问题是“通常”为多 CPU 体系结构编写的文章数量,而我只对 Intel x86-64体系结构特别感兴趣。