Diese Frage ist eine Nachbereitung/Klarstellung dazu:
Implementiert der MOV x86-Befehl einen C++11-Memory_order_release-Atomspeicher?
Darin heißt es MOV
Die Assembler-Anweisung reicht aus, um die Acquiring-Release-Semantik auf x86 auszuführen. Brauchen wir nicht LOCK
, Zäune o xchg
usw. Ich habe jedoch Schwierigkeiten zu verstehen, wie dies funktioniert.
In Intel doc Vol 3A Kapitel 8 heißt es:
https://software.intel.com/sites/default/files/managed/7c/f1/253668-sdm-vol-3a.pdf
In einem System mit einem Prozessor (Kern) ….
- Reads werden nicht mit anderen Reads neu geordnet.
- Schreibvorgänge werden nicht mit älteren Lesevorgängen neu geordnet.
- Schreibvorgänge in den Speicher werden nicht mit anderen Schreibvorgängen neu geordnet, mit den folgenden Ausnahmen:
aber das ist für einen einzelnen Kern. Der Multi-Core-Abschnitt scheint nicht zu erwähnen, wie Lasten erzwungen werden:
In einem Mehrprozessorsystem gelten die folgenden Ordnungsprinzipien:
- Einzelne Prozessoren verwenden dieselben Ordnungsprinzipien wie in einem Einzelprozessorsystem.
- Schreibvorgänge durch einen einzelnen Prozessor werden von allen Prozessoren in der gleichen Reihenfolge beobachtet.
- Schreibvorgänge von einem einzelnen Prozessor werden NICHT in Bezug auf die Schreibvorgänge von anderen Prozessoren geordnet.
- Die Erinnerungsordnung gehorcht der Kausalität (die Erinnerungsordnung respektiert die transitive Sichtbarkeit).
- Jegliche zwei Speicherungen werden von anderen Prozessoren als denen, die die Speicherungen durchführen, in einer konsistenten Reihenfolge gesehen
- Gesperrte Anweisungen haben eine Gesamtordnung.
Also wie kann MOV
allein kann Acquisition-Release erleichtern?
Ist nicht
MOV
eher fortlaufend konsistent von selbst als Puttenrel-acq
Zäune? Denn es wird nur unter sehr eingeschränkten Bedingungen nachbestellt. Es erinnert mich an Herb Sutters sehr aufschlussreiche Präsentation des SC-DRF-Speichermodells vor langer Zeit.– Dekan Seo
20. Februar 20 um 7:04 Uhr
@DeanSeo: Nein, das Hardwarespeichermodell von x86 ist SC + ein Speicherpuffer mit Speicherweiterleitung. Dies ist wie acq_rel, nicht SC.
– Peter Cordes
20. Februar 20 um 7:16 Uhr
@PeterCordes Interessant! Danke für die Korrektur!
– Dekan Seo
20. Februar 20 um 7:25 Uhr