【发布时间】:2013-12-17 10:37:20
【问题描述】:
我经常在互联网上发现 LFENCE 在 x86 处理器中毫无意义,即它什么也不做,所以我们可以完全轻松地使用 SFENCE,因为 MFENCE = SFENCE + @987654328 @ = SFENCE + NOP = SFENCE.
但如果LFENCE 没有意义,那么为什么我们有四种方法可以在 x86/x86_64 中实现顺序一致性:
-
LOAD(无围栏)和STORE+MFENCE -
LOAD(无围栏)和LOCK XCHG -
MFENCE+LOAD和STORE(无围栏) -
LOCK XADD( 0 ) 和STORE(没有围栏)
取自这里:http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
以及底部第 34 页 Herb Sutter 的表演:https://skydrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&wdo=2&authkey=!AMtj_EflYn2507c
如果LFENCE没有做任何事情,那么方法(3)的含义如下:SFENCE + LOAD and STORE (without fence),但是在LOAD之前做SFENCE是没有意义的。即如果LFENCE什么都不做,则方法(3)没有意义。
处理器 x86/x86_64 中的指令 LFENCE 是否有意义?
回答:
1. LFENCE 在下面接受的答案中描述的情况下是必需的。
2. 方法(3)不应单独看待,而应结合前面的命令。例如方法(3):
MFENCE
MOV reg, [addr1] // LOAD-1
MOV [addr2], reg //STORE-1
MFENCE
MOV reg, [addr1] // LOAD-2
MOV [addr2], reg //STORE-2
我们可以将方法(3)的代码改写如下:
SFENCE
MOV reg, [addr1] // LOAD-1
MOV [addr2], reg //STORE-1
SFENCE
MOV reg, [addr1] // LOAD-2
MOV [addr2], reg //STORE-2
这里SFENCE 可以防止重新排序 STORE-1 和 LOAD-2。为此,在 STORE-1 命令 SFENCE 刷新 Store-Buffer 之后。
【问题讨论】:
-
有些指令带有“非临时提示”,不像通常的加载和存储那样有序;我想那些可能会从击剑中受益。 (编辑:这实际上是在您链接的页面上提到的。)
标签: assembly x86 x86-64 atomic memory-barriers