std::atomic ストアでの順序一貫性の確保における XCHG の役割
通常のストアの後に読み取りを使用するのは直感的に思えるかもしれませんが、 /write メモリ バリアで逐次一貫性を実現、std::atomic のストアで逐次一貫性を実現(seq_cst) 注文では代わりに XCHG を利用します。このアプローチは、x86 および x86_64 アーキテクチャにおける XCHG の固有の特性によって正当化されます。
アトミック RMW およびフル メモリ バリア
x86 アーキテクチャでは、アトミックな読み取り、変更、書き込みが行われます。 XCHG などの (RMW) 操作は、本質的に完全なメモリ バリアとして機能します。 XCHG の暗黙的なロック プレフィックスはグローバルな順序を強制し、実行されるロード操作とストア操作がバッファリングやロード/ロードの並べ替えによって分離されないようにします。
シーケンシャル一貫性とシーケンシャル リリース
x86 上の通常のストア操作にはリリース セマンティクスがあり、これにより後続の操作で並べ替えることができます。ロードを取得します。順次一貫性を強制するには、リリース バリア単独ではなく、順次リリース バリアが必要になります。
パフォーマンスに関する考慮事項
seq_cst ストアの実装に MFENCE と XCHG のどちらを選択するかパフォーマンスのトレードオフが伴います。 MFENCE は Intel Skylake およびそれ以降のアーキテクチャでのアウトオブオーダー実行をブロックしますが、XCHG はブロックしません。この違いは、周囲のコードの実行に影響を与える可能性があります。キャッシュ状態やスレッド競合などの他の要因もパフォーマンスに影響を与える可能性があります。
コンパイラーとカーネルの推奨事項
GCC の最新バージョンと最新のコンパイラーは、次のような場合に MFENCE よりも XCHG を優先します。 seq_cst はほとんどのプラットフォームに保存されます。 Linux カーネルは、アトミック seq_cst ストアに XCHG を使用しますが、さまざまな種類のメモリ バリアには XCHG と MFENCE の両方を使用します。
x86 の暗黙的なメモリ バリア
このステートメントは、 x86 および x86_64 ストアが暗黙的な取得フェンスを持っているという考えは誤りです。これらのアーキテクチャ上のストアには、デフォルトでリリース セマンティクスがあります。セマンティクスを取得するには、取得操作を明示的に指定する必要があります。
結論
std::atomic の seq_cst ストアで XCHG を使用すると、x86 および x86_64 プラットフォームでの順次一貫性が保証されます。 RMW 操作に固有のメモリ バリア プロパティを完全に活用することによって。 MFENCE などの他のオプションは、特定のハードウェアや動作条件に応じて、保証が弱かったり、異なるパフォーマンス特性を提供する可能性があります。
以上がなぜ `std::atomic` はストア内の順序一貫性を確保するために XCHG を使用するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。