Часто в Интернете я обнаружил, что LFENCE
не имеет смысла в процессорах x86, т.е. ничего не делает, поэтому вместо MFENCE
мы можем безболезненно использовать SFENCE
, потому что MFENCE
= SFENCE
+ LFENCE
= SFENCE
+ NOP
= SFENCE
.
Но если LFENCE
не имеет смысла, то почему у нас есть четыре подхода, чтобы сделать Sequential Consistency в 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
Помимо выступлений Herb Sutter на стр. 34 внизу: https://skydrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&wdo=2&authkey=!AMtj_EflYn2507c
Если LFENCE
ничего не сделал, то подход (3) имел бы следующие значения: SFENCE + LOAD and STORE (without fence)
, но нет смысла делать SFENCE
до LOAD
. Т.е. если LFENCE
ничего не делает, подход (3) не имеет смысла.
Делает ли какая-либо команда чувств LFENCE
в процессорах x86/x86_64?
ОТВЕТ:
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.