Часто в Интернете я обнаружил, что 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.