Obwohl C 11 sperrenfreies std::atomic
x86_64 unterstützt die folgenden atomaren Operationen auf Duplikaten, die mit Lock- ausgeführt werden. frei Anweisungen:
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.
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!