Heim >Backend-Entwicklung >C++ >Warum verwendet der Store von „std::atomic' XCHG für sequentielle Konsistenz auf x86?

Warum verwendet der Store von „std::atomic' XCHG für sequentielle Konsistenz auf x86?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-23 14:52:20714Durchsuche

Why does `std::atomic`'s store use XCHG for sequential consistency on x86?

Warum der Store von std::atomic XCHG für sequentielle Konsistenz verwendet

Im Kontext von std::atomic für x86- und x86_64-Architekturen a Der Speichervorgang mit sequentieller Konsistenz (std::memory_order_seq_cst) verwendet XCHG anstelle eines einfachen Speichers mit einer Speicherbarriere als Technik zur Erzielung einer semantischen Release-Semantik.

Sequentielle Konsistenz und xchg

Sequentielle Konsistenz schreibt vor, dass alle Speicheroperationen scheinbar in einer bestimmten Reihenfolge ausgeführt werden , und diese Reihenfolge ist für alle Threads gleich. XCHG, ein x86-Befehl, der die Werte zweier Operanden atomar austauscht, erfüllt von Natur aus diese sequentielle Konsistenzanforderung. Durch die Verwendung von XCHG zur Ausführung eines Schreibvorgangs stellt std::atomic sicher, dass der Speicher an einem bestimmten Punkt in der Ausführungsreihenfolge global für alle Threads sichtbar wird, wodurch eine Neuordnung bei nachfolgenden Vorgängen verhindert wird.

mov- store mfence vs. XCHG

Während ein einfacher mov-store gefolgt von einem Memory Fence (wie mfence) theoretisch Release-Semantik bereitstellen könnte, Für Speichervorgänge mit sequenzieller Freigabe ist dies nicht ausreichend. MFENCE, eine Memory-Fence-Anweisung, die eine Speicherbarriere einrichtet, stellt sicher, dass vorherige Schreibvorgänge vor dem Fortfahren in den Speicher übernommen werden. Es verhindert jedoch nicht, dass nachfolgende Ladevorgänge vor dem Release-Store neu angeordnet werden.

Leistungsüberlegungen

Die Wahl zwischen mov-store mfence und XCHG für sequenzielle Release Store-Vorgänge erfordern Leistungskompromisse.

  • Auf bestimmten CPUs (z. B. Intel Skylake) kann XCHG effizienter sein als mov-store mfence, insbesondere wenn es keinen umgebenden abhängigen Code gibt, der mit der atomaren Operation synchronisiert werden muss.
  • Auf anderen CPUs ist mov-store mfence möglicherweise für Szenarien mit hohem Durchsatz oder wenn umgebender Code überlappen kann, vorzuziehen Ausführung mit der atomaren Operation.

Implementierungsdetails

In In der Praxis variiert die spezifische Implementierung des Speichers von std::atomic mit sequentieller Konsistenz je nach Compiler und Hardwarearchitektur.

  • GCC/Clang: Ursprünglich wurde mov-store mfence verwendet, aber haben Kürzlich wurde auf die Verwendung von XCHG für seq-cst-Stores umgestellt.
  • Intel Compiler:Verwendung XCHG für SEQ-CST-Stores.
  • Microsoft Visual C: Verwendet auch XCHG für SEQ-CST-Stores.

Implicit Acquire Fence

Die Aussage, dass x86-Stores einen impliziten Erwerbszaun haben, ist falsch. Stores auf x86 haben eine Release-Semantik, keine Acquire-Semantik. Acquire-Semantiken werden typischerweise mithilfe von Speicherbarrieren wie mfence oder atomaren Lesevorgängen mit der std::memory_order_acquire-Semantik erzwungen.

Das obige ist der detaillierte Inhalt vonWarum verwendet der Store von „std::atomic' XCHG für sequentielle Konsistenz auf x86?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn