Brauchen wir mfence bei der Verwendung von xchg?

7

Ich habe eine Menge und teste xchg basierte Assembly-Sperre. meine Frage ist:

Müssen wir bei der Verwendung von mfence Anweisung Memory Fencing verwenden ( sfence , lfence oder xchg )?

Bearbeiten:

64-Bit-Plattform: mit Intel nehalem

    
Jay D 27.01.2012, 00:41
quelle

4 Antworten

11

Wie in den anderen Antworten angegeben, ist das Sperrpräfix hier implizit, so dass es auf der Assembler-Ebene kein Problem gibt. Wenn Sie das als In-line-Assembler verwenden, liegt das Problem möglicherweise auf der C (oder C ++) Ebene. Hier müssen Sie sicherstellen, dass der Compiler keine Anweisungen in Bezug auf Ihre xchg neu anordnet. Wenn Sie gcc (oder Cousins) verwenden, würden Sie in der Regel etwas tun:

%Vor%

deklarieren Sie die Anweisung als flüchtig und fügen Sie den "Speicher" Clobber hinzu.

    
Jens Gustedt 27.01.2012, 07:29
quelle
12

Laut Kapitel 8 Bus-Sperrung des Intel 64 und IA-32 Architectures Software-Entwicklerhandbuch, Band 3A

  

Das Speicherordnungsmodell verhindert, dass Lasten und Speicher mit gesperrten Anweisungen, die früher oder später ausgeführt werden, neu angeordnet werden.

Somit fungiert die gesperrte XCHG Anweisung als Speicherbarriere, und es wird keine zusätzliche Barriere benötigt.

    
markgz 27.01.2012 00:58
quelle
5

Nein. xchg wird garantiert in etwas kompiliert, was Konsistenz auf der Hardwareebene gewährleistet.

    
Eugen Rieck 27.01.2012 00:43
quelle
-1

Die xchg-Anweisung hat ein implizites Sperrpräfix gemäß Intel-Handbüchern.

    
Osman Turan 27.01.2012 07:48
quelle

Tags und Links