ホームページ > バックエンド開発 > C++ > _mm_sfence、_mm_lfence、または _mm_mfence をいつ使用する必要がありますか?

_mm_sfence、_mm_lfence、または _mm_mfence をいつ使用する必要がありますか?

Patricia Arquette
リリース: 2024-11-18 00:05:02
オリジナル
458 人が閲覧しました

When Should You Use _mm_sfence, _mm_lfence, or _mm_mfence?

_mm_sfence、_mm_lfence、または _mm_mfence をいつ使用するかを決定する

マルチスレッド コードを利用する場合、メモリの順序を効果的に制御する必要が生じます。 x86 プロセッサは強く順序付けされたメモリ モデルを誇っていますが、C と C はより緩和されたモデルに準拠しています。これにより、組み込み関数 _mm_sfence、_mm_lfence、および _mm_mfence の適切な使用法に関して混乱が生じる可能性があります。

メモリの順序付けについて

取得/解放セマンティクスの場合、コンパイル時の順序変更の防止という概念で強調されているように、それだけで十分です。コンパイラの障壁。これにより、不要な asm 命令によるパフォーマンスを妨げることなく、抽象マシンでの操作の適切な順序が保証されます。 GNU C/C asm("" ::: "memory") のようなオプションはコンパイラの障壁として効果的に機能し、パフォーマンスへの影響を最小限に抑えながらこの目標を達成します。

代わりに、C 11 std::atomic は次のようなシームレスなソリューションを提供します。 shared_var.store(tmp, std::memory_order_release)、変更のグローバルな可視性を確保します。独自のバージョンの C11/C 11 std::atomic を実装している場合、_mm_mfence は潜在的な値を保持します。mfence を利用して順次一貫性を確立し、前のストアがグローバルにアクセス可能になる前に後続のロードで値がフェッチされるのを防ぎます。

それぞれの役割を検討する組み込み

_mm_sfence:

  • 他のスレッドが依存するフラグを設定する前にフェンスを必要とする、NT ストアに最適です。
  • 弱く順序付けされた NT ストアを使用する場合に、リリース/取得の同期を確保します。通常のストアとは異なります。

_mm_lfence:

  • WC (書き込み結合) が関与する場合にのみロードが弱く順序付けされるため、ロード フェンスとしてはほとんど使用されません。 ) メモリ領域。
  • 一部のプロセッサでの実行フローを制御するために利用される可能性があり、後の命令が実行されるのを防ぎます。 lfence が完了するまで実行されます。

_mm_mfence:

  • 順次一貫性のために mfence を利用して、独自のバージョンの std::atomic を実装するのに潜在的に役立ちます。 .
  • 注: mfence はロックされているよりも遅くなる可能性がありますatomic-RMW 操作。

パフォーマンスに関する注意事項

フェンスは店舗の可視性を加速するものではないことを認識することが重要です。これらは、前の操作が完了するまで現在のスレッド内の操作を延期するだけです。

結論

一般的な使用例では、C 11 std::atomic または C11 stdatomic は堅牢な機能を提供します。メモリの順序を制御するためのユーザーフレンドリーなソリューション。 NT ストアまたは std::atomic のカスタム実装が関与するシナリオでは、_mm_sfence および _mm_mfence が役立つ可能性がありますが、パフォーマンスへの影響を慎重に考慮することが重要です。

以上が_mm_sfence、_mm_lfence、または _mm_mfence をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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