Heim >Backend-Entwicklung >C++ >Wie werden atomare Gleitkomma- und Vektoroperationen auf x86_64-Architekturen gehandhabt?

Wie werden atomare Gleitkomma- und Vektoroperationen auf x86_64-Architekturen gehandhabt?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-07 06:08:15485Durchsuche

How are Atomic Floating-Point and Vector Operations Handled on x86_64 Architectures?

Atomere Gleitkommaoperationen auf x86_64

Obwohl C nativ keine atomaren Doppeloperationen unterstützt, bietet es sperrenfreie atomare Implementierungen auf den meisten Plattformen. Diese Implementierungen verwenden typischerweise CAS-Operationen (Compare-and-Swap) mit der Sperre cmpxchg-Anweisung.

Für atomare Vektoroperationen auf x86_64 gibt es keine direkte Hardwareunterstützung. Allerdings ist bei ausgerichteten 128-Bit- und 256-Bit-Ladevorgängen und -Speichern im Allgemeinen garantiert, dass sie atomar sind. Für nicht ausgerichtete Vektoroperationen sind die Atomizitätsgarantien weniger klar.

Unterstützung auf Assembly-Ebene für Doppel- und Vektoroperationen

x86_64 bietet Unterstützung auf Assembly-Ebene für atomare Operationen auf Doppel und Vektoren:

  • Doppel: Atomar Lade-, Speicher- und Additions-/Subtraktions-/Multiplikationsoperationen werden durch die Speicherzielanweisungen movsd, movq, addsd, subsd und mulsd unterstützt.
  • Vektoren: Ausgerichtet auf 128-Bit und 256 -bit-Lade- und -Speichervorgänge sind auf x86_64 mit AVX-Unterstützung atomar. Für nicht ausgerichtete Vektoroperationen gibt es keine direkte Hardware-Garantie für die Atomizität.

MSVC 2017 Implementierung von Lock-Free atomic

MSVC 2017 implementiert sperrenfreies atomares Operationen mit Ganzzahlregistern doppelter Breite. Der Ladevorgang umfasst beispielsweise:

CAS: movq QWORD PTR [dst_addr], rax  // 64-bit CAS

Der Add-Vorgang verwendet:

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax  // 128-bit CAS

Atomic RMW (Read-Modify-Write) Operations

Atomere Read-Modify-Write-Operationen (RMW) wie fetch_add erfordern eine CAS-Schleifenimplementierung. Auf x86_64 unterstützt der CAS-Befehl 16-Byte-Operationen (cmpxchg16b).

CAS: lock cmpxchg16b QWORD PTR [dst_addr], rax

CAS-Schleifen bieten zwar atomare RMW-Funktionalität, sind jedoch teurer als atomare Lade- und Speichervorgänge.

Zusätzliche Hinweise

  • Einige Nicht-x86-Hardware unterstützt atomare Additionsoperationen für Float-/Double-Typen.
  • Intels Transactional Memory Extensions (TSX) bieten verbesserte Unterstützung für atomare FP- und SIMD-Operationen.
  • Compiler generieren häufig ineffizienten Code für atomare Operationen, aber es werden Verbesserungen vorgenommen.
  • Atomere Operationen auf gemeinsam genutzten Arrays von ausgerichteten Doppeln sollten sicher sein, während Operationen auf nicht ausgerichteten Vektoren Tearing beinhalten können.
  • Es ist möglich, atomare Operationen auf 16 zu implementieren -Byte-Objekte mit cmpxchg16b, aber die Leistung wird schlecht sein.

Das obige ist der detaillierte Inhalt vonWie werden atomare Gleitkomma- und Vektoroperationen auf x86_64-Architekturen gehandhabt?. 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