`std::atomic` のストアが x86 での逐次一貫性のために XCHG を使用するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-23 14:52:20
オリジナル
708 人が閲覧しました

Why does `std::atomic`'s store use XCHG for sequential consistency on x86?

std::atomic のストアが逐次一貫性のために XCHG を採用する理由

x86 および x86_64 アーキテクチャの std::atomic のコンテキストでは、逐次一貫性のあるストア操作 (std::memory_order_seq_cst) を採用順次リリース セマンティクスを実現する手法として、メモリ バリアを備えた単純なストアの代わりに XCHG を使用します。

順次一貫性と xchg

順次一貫性により、すべてのメモリ操作が表示されるようになります。ある順番で実行され、この順序はすべてのスレッドで同じです。 XCHG は 2 つのオペランドの値をアトミックに交換する x86 命令であり、本質的にこの逐次一貫性要件を満たします。 XCHG を使用して書き込み操作を実行することにより、std::atomic は、実行順序の特定の時点でストアがすべてのスレッドにグローバルに認識されるようにし、後続の操作による並べ替えを防ぎます。

mov- store mfence vs. XCHG

一方、単純な mov-store に続いてメモリ フェンス (mfence など) を使用する場合、理論的にはリリース セマンティクスを提供しますが、順次リリースのストア操作には十分ではありません。メモリ バリアを確立するメモリ フェンス命令である MFENCE は、続行する前に以前の書き込み操作がメモリにコミットされていることを確認します。ただし、後続のロード操作がストアのリリース前に再順序付けされるのを防ぐことはできません。

パフォーマンスに関する考慮事項

順次リリースのための mov-store mfence と XCHG の選択ストア操作にはパフォーマンスのトレードオフが伴います。

  • 特定の CPU (例: Intel Skylake)、特にアトミック操作と同期する必要がある依存コードが周囲にない場合、XCHG は mov-store mfence よりも効率的です。
  • 他の CPU では、mov-store mfence の方が好ましい場合があります。高スループットのシナリオ、または周囲のコードがアトミックな実行と重複する可能性がある場合

実装の詳細

実際には、逐次一貫性を備えた std::atomic ストアの具体的な実装は、コンパイラとハードウェア アーキテクチャによって異なります。

  • GCC/Clang: 元々使用されていたものmov-store mfence ですが、最近 seq-cst ストアに XCHG の使用に切り替えました。
  • インテル コンパイラー: seq-cst ストアに XCHG を使用します。
  • Microsoft Visual C : seq-cst にも XCHG を使用しますstores.

Implicit Acquire Fence

x86 ストアに暗黙的取得フェンスがあるという記述は正しくありません。 x86 上のストアには、取得セマンティクスではなくリリース セマンティクスがあります。取得セマンティクスは通常、mfence などのメモリ バリアや std::memory_order_acquire セマンティクスによるアトミック読み取り操作を使用して強制されます。

以上が`std::atomic` のストアが x86 での逐次一貫性のために XCHG を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート