„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 18.11.2024
Durchsuche:122

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, um eine semantische Release-Semantik zu erreichen.

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, ist dies für sequenzielle Release-Store-Vorgänge 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 Leistungseinbußen.

  • 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 synchronisiert werden muss mit der atomaren Operation.
  • Auf anderen CPUs ist mov-store mfence möglicherweise für Szenarien mit hohem Durchsatz vorzuziehen oder wenn umgebender Code die Ausführung mit der atomaren Operation überlappen kann.

Implementierungsdetails

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

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

Implicit Acquire Fence

Die Aussage, dass x86 Geschäfte haben einen impliziten Erwerbszaun, der falsch ist. 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3