Atomere Operationen auf Doubles und Vektoren in x86_64
Während C 11 std::atomic bietet sperrenfreie Operationen für die meisten Implementierungen, atomare AVX- oder SSE-Vektoroperationen bleiben CPU-abhängig und haben keine Unterstützung auf Assembly-Ebene.
Atomic Operations on Doubles
- Lade- und Speichervorgänge sind für 8 Bytes, einschließlich Doubles, natürlich atomar.
- Lese-, Änderungs- und Schreibvorgänge erfordern einen Wiederholungsversuch Schleife mit cmpxchg (oder TSX), da es keine direkte Speicherzielanweisung gibt.
- Cmpxchg16b ist für 16-Byte-atomare RMW-Operationen verfügbar.
- Einige Sonderfälle von IEEE-Float-Operationen können implementiert werden unter Verwendung ganzzahliger Operationen (z. B. Absolutwert, Negation).
Atomar Operationen auf Vektoren
- Es gibt keine Hardwareunterstützung für atomare Vektorlade-/Speicheroperationen im gesamten Cache-Kohärenzsystem.
- Vektorladungen/-speicherungen auf ausgerichteten Arrays von Doubles sind wahrscheinlich sicher zu verwenden, ohne dass das Risiko eines Cache-Line-Tearings besteht.
- Für 16-Byte atomares Laden/Speichern/RMW, cmpxchg16b kann verwendet werden.
- Atomisches Aktualisieren von 16-Byte-Objekten ist möglich, aber das separate Lesen der 8-Byte-Hälften ist nicht garantiert atomar.
Compiler-Unterstützung
- Compiler generieren nicht immer eine effiziente Assembly für atomar Laden/Speichern (z. B. mithilfe von mov-Anweisungen direkt zu/von xmm-Registern).
- Atomere Vektoren (atomar<__m128d> oder atomar<__m256d>) werden nicht effizient implementiert, da sie cmpxchg16b selbst für schreibgeschützte Zwecke erfordern oder Nur-Schreib-Vorgänge.
Das obige ist der detaillierte Inhalt vonWie atomar sind Doppel- und Vektoroperationen auf x86_64?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!