6

この質問に関しては、x86とx86-64にのみ興味があります。

MSVC 2005の場合、__ faststorefenceのドキュメントには、「先行するすべてのストアが後続のストアの前にグローバルに表示されることが保証されます」と記載されています。

MSVC 2008および2010では、次のように変更されました。 「ロードメモリ参照とストアメモリ参照の両方を含む、以前のすべてのメモリ参照が、後続のメモリ参照の前にグローバルに表示されることを保証します。」

後者の書き方は、私の意見では、これは古いストアの前にCPUがロードを並べ替えることもブロックすることを意味します。これは最初の定義とは異なります。つまり、本質的には、非一時ストアと古いストアのブロックまたは並べ替えのみを処理することです(他の唯一の並べ替えx86(-64)は処理します)。

ただし、ドキュメントは矛盾しているように見えます。「x64プラットフォームでは、このルーチンはsfence命令よりも高速なストアフェンスである命令を生成します。x64プラットフォームでは_mm_sfenceの代わりにこの組み込み型を使用してください。」

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

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

4

1 に答える 1

3

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

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

于 2011-06-27T08:57:17.887 に答える