_mm_sfence、_mm_lfence、および _mm_mfence はどのような場合に使用する必要がありますか?
マルチスレッド プログラミングでは同時実行関連の複雑さが生じ、データを維持するメカニズムが必要になります整合性と同期。 Intel の組み込みライブラリには、x86 アーキテクチャでメモリの順序付けを制御するための _mm_sfence、_mm_lfence、_mm_mfence などのいくつかの関数が用意されています。
x86 のメモリ順序付け
x86 CPU には強力な機能があります。順序付けされたメモリ モデルですが、C と C の方が弱いです。したがって、メモリの適切な順序を確保し、データの破損や競合状態を防止するには、追加の予防措置が必要です。
_mm_sfence
_mm_sfence は主に非テンポラル (NT) ストアの後に使用されます。 (_mm_stream_*) 投機的な並べ替えを防止します。 NT ストアは順序が弱いため、他のメモリ操作と比べて順序が崩れているように見える可能性があります。 _mm_sfence は、NT ストアがメモリにコミットされた後、後続のメモリ操作がグローバルに可視になることを保証するバリアを作成します。
_mm_lfence
_mm_lfence がロード フェンスとして使用されることはほとんどありません。ビデオ RAM などの書き込み結合 (WC) メモリ領域からロードする場合にのみ関連します。 _mm_lfence は、リタイアするまで後続の命令の実行を防ぐことができ、マイクロベンチマークに役立ちます。
_mm_mfence
_mm_mfence は逐次的な一貫性を提供し、後続のロードが終了するまで値を読み取ることができないようにします。以前のストアが世界中で表示されるようになります。これは、カスタム バージョンの std::atomic を実装する場合、または投機的になる操作のメモリ順序を明示的に制御する必要がある場合に役立ちます。
概要
以上が_mm_sfence、_mm_lfence、_mm_mfence はどのような場合に使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。