25

マルチコアマシンのメモリフェンスを理解する必要があります。私はこのコードを持っていると言います

コア1

mov [_x], 1; mov r1, [_y]    

コア2

mov [_y], 1; mov r2, [_x]

これで、メモリフェンスがない場合の予期しない結果は、実行後にr1とr2の両方が0になる可能性があることです。私の意見では、この問題に対処するには、両方のコードにメモリフェンスを配置する必要があります。これは、1つだけに設定しても問題が解決しないためです。次のようなもの...

コア1

mov [_x], 1; memory_fence; mov r1, [_y]  

コア2

mov [_y], 1; memory_fence; mov r2, [_x]

私の理解は正しいですか、それとも私はまだ何かが欠けていますか?アーキテクチャがx86であると想定します。また、誰かがC ++コードにメモリフェンスを配置する方法を教えてもらえますか?

4

2 に答える 2

15

フェンスは、フェンスする操作(ロードとストア)をシリアル化します。つまり、フェンスが実行されるまで他の操作を開始することはできませんが、先行するすべての操作が完了するまでフェンスは実行されません。Intelを引用すると、これの意味がもう少し正確になります(MFENCE命令、3-628ページ、Vol。2A、Intel命令リファレンスから引用):

このシリアル化操作により、プログラム順にMFENCE命令の前にあるすべてのロードおよびストア命令が、MFENCE命令の後に続くロードまたはストア命令の前にグローバルに表示されることが保証されます。

  1. ロード命令は、デスティネーションレジスタにロードされる値が決定されると、グローバルに表示されると見なされます。

プラットフォームとコンパイラに依存するため、C ++でフェンスを使用するのは難しいです(C ++ 11はどこかにフェンスのセマンティクスを持っている可能性があり、他の誰かがそれに関する情報を持っている可能性があります)。MSVCまたはICCを使用するx86の場合、ロード、ストア、およびロード+ストアフェンシング_mm_lfence_mm_sfence&を使用できます(これらの一部はSSE2命令であることに注意してください)。_mm_mfence

注:これは、Intelの観点、つまりx86(32または64ビット)またはIA64プロセッサを使用する観点を前提としています。

于 2011-09-02T07:22:39.447 に答える
4

C ++ 11(ISO / IEC 14882:2011)は、マルチスレッド対応のメモリモデルを定義します。現在、新しいメモリモデルを実装しているコンパイラはありませんが、AnthonyWilliamsによるC++ ConcurrencyinActionは非常によく文書化されています。リラックスした操作とメモリフェンスについて説明している第5章-C++メモリモデルとアトミックタイプの操作を確認できます。また、彼は、新しい標準のコンパイラベンダーサポートが得られるまで使用できるjust::threadライブラリの作成者です。just :: threadは、boost::threadライブラリのベースです。

于 2011-10-18T03:26:29.117 に答える