Heim > Backend-Entwicklung > C++ > Unterstützt x86_64 atomare Operationen auf Doubles und SSE/AVX-Vektoren?

Unterstützt x86_64 atomare Operationen auf Doubles und SSE/AVX-Vektoren?

Mary-Kate Olsen
Freigeben: 2024-11-27 06:58:10
Original
1037 Leute haben es durchsucht

Does x86_64 Support Atomic Operations on Doubles and SSE/AVX Vectors?

Atomic Floating-Point-Operationen und SSE/AVX Vector Load/Store auf x86_64

Obwohl C 11 sperrenfreies std::atomic unterstützt, ist dies der Fall Unterstützt derzeit aufgrund von CPU-Abhängigkeiten keine atomaren AVX/SSE-Vektoren. Es stellt sich jedoch die Frage: Bietet x86_64 Unterstützung auf Assembly-Ebene für atomare Operationen auf Duplikaten oder Vektoren?

Atomoperationen auf x86_64

x86_64 unterstützt die folgenden atomaren Operationen auf Duplikaten, die mit Lock- ausgeführt werden. frei Anweisungen:

  • Laden
  • Speichern
  • Addieren
  • Subtrahieren
  • Multiplizieren

Atomar Vektoroperationen auf x86_64

Leider gibt es keine Möglichkeit, die Atomizität von 128b- oder 256b-Vektorspeichern oder -ladungen im gesamten Cache-Kohärenzsystem zu gewährleisten. Für ausgerichtete Vektoren können Sie jedoch sicher Vektorladungen und -speicherungen auf gemeinsam genutzten Doppelarrays verwenden, ohne dass das Risiko eines Tearings besteht.

Wenn atomare 16B-Ladungen erforderlich sind, besteht Ihre einzige Option darin, lock cmpxchg16b mit wünschenswert=erwartet zu verwenden. Wenn dies gelingt, ersetzt es den vorhandenen Wert durch sich selbst. Wenn dies fehlschlägt, erhalten Sie die alten Inhalte. Beachten Sie, dass dieses „Laden“ zu Fehlern im Nur-Lese-Speicher führt. Seien Sie daher vorsichtig, wenn Sie Zeiger an Funktionen übergeben, die diesen Vorgang ausführen.

Atomic 16B Stores und RMW können beide die Sperre cmpxchg16b auf die offensichtliche Weise verwenden. Dies macht reine Stores deutlich teurer als reguläre Vektorstores, insbesondere bei mehreren cmpxchg16b-Wiederholungsversuchen. Atomares RMW ist jedoch bereits teuer.

Einschränkungen atomarer Vektoroperationen

  • atomic<__m128d> wäre aufgrund der Verwendung von cmpxchg16b selbst für Nur-Lese- oder Nur-Schreib-Vorgänge langsam.
  • atomic<__m256d> kann nicht sperrenfrei sein.
  • alignas(64) atomic shared_buffer[1024]; würde eine automatische Vektorisierung ermöglichen, aber Compiler generieren dafür kein effizientes ASM.

16B-Objekte atomar lesen und aktualisieren

Sie können 16B-Objekte atomar aktualisieren, aber die 8B-Hälften separat lesen. Compiler bieten jedoch keine saubere Möglichkeit, dies auszudrücken, und das Inlining von cmpxchg16b ist aufgrund laufender Überlegungen von Compiler-Entwicklern unzuverlässig.

Das obige ist der detaillierte Inhalt vonUnterstützt x86_64 atomare Operationen auf Doubles und SSE/AVX-Vektoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage