6

この質問に関して、私はx86とx86-64だけに興味があります。
MSVC 2005
、__faststorefenceのドキュメントは言う:「保証のすべての直前が後続前に、グローバルに表示されていること。」 「ロードとストアメモリ参照の両方を含むすべての前メモリ参照は、任意の後続メモリ参照前に、グローバルに可視であることを保証する。」

はMSVC 2008および2010の場合、それに変更しました


後者の書き方は、私の意見では、これは古いストアの前にCPUの負荷の並べ替えをブロックすることを意味します。これは、最初の定義とは異なります。つまり、組み込み関数は、古いストアでの非一時的なストアのブロッキングまたは並べ替えを処理することのみを意味します(他のx86(-64)の並べ替えだけです)。

しかし、その後、ドキュメント自体に矛盾するように見える:「x64プラットフォームでは、このルーチンはSFENCE命令よりも高速ストアフェンスある命令を生成し、x64プラットフォーム上の代わりに_mm_sfenceのこの本質的なを使用してください。 "

これはまだSFXのような機能を持っていることを意味しています。したがって、古いストアでもロードを並べ替えることができます。それはどちらですか?誰かが私の混乱をクリアすることはできますか?

PS:この関数のGCC版を探して、私はlong local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));に出くわしましたが、それは32ビットコードからだと思います。 64ビットアナログは何でしょうか?
__faststorefenceの動作は何ですか?

+7

「__faststorefence」よりも良い質問タイトルを付けることはできますか? –

+1

@JaredFarrish:決して遅くない方がいいですか? :) – GManNickG

答えて

2

引用したGCCのバージョンは、MSVCが生成するコードに相当します。これは、x86/x86-64プロセッサアーキテクチャのドキュメントでは、ロード命令とストア命令がLOCK ed命令で並べ替えられないように指定しているという事実に依存しています。

一般的にメモリモデルの制限がそれらの命令に適用されないため、これが非一時ストアに適用されるかどうかはわかりません。

+0

こんにちはアンソニー、答えに感謝します。なぜなら、この組み込み関数のドキュメンテーションでは、32と64の両方ではなく、x64プラットフォームでの方が高速であると指定されているのはなぜかというと、ロックされた命令はx86-64の場合に比べて安価です。さらに、ロードとストアの両方が並べ替えられないようにする場合は、これが順次整合性のための十分なフェンスですか(非一時ストアの場合を除く)。 –

+1

この組み込み関数は、x86-64のMSVCでのみ使用できます。どうしてか分かりません。アーキテクチャは本質的に同じであるため、x86-64のx86と同じコストを「MFENCE」と同じにすることが期待されます。非一時的なストアを無視すると、これは逐次整合性のための十分なフェンスです。 –

関連する問題