_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:
_mm_lfence:
_mm_mfence:
パフォーマンスに関する注意事項
フェンスは店舗の可視性を加速するものではないことを認識することが重要です。これらは、前の操作が完了するまで現在のスレッド内の操作を延期するだけです。
結論
一般的な使用例では、C 11 std::atomic または C11 stdatomic は堅牢な機能を提供します。メモリの順序を制御するためのユーザーフレンドリーなソリューション。 NT ストアまたは std::atomic のカスタム実装が関与するシナリオでは、_mm_sfence および _mm_mfence が役立つ可能性がありますが、パフォーマンスへの影響を慎重に考慮することが重要です。
以上が_mm_sfence、_mm_lfence、または _mm_mfence をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。