4

以下のようにメモリ バリアが定義されている従来の C++ コードを読んでいます。主な OS は linux と vxworks です。コンパイラは gcc (WindRiver の gcc) です。

#if((KCompilerGNU)||(kCompilerWindRiver))
   #define MEMORY_BARRIER   __asm__ volatile("nop\n");
#else
   #define MEMORY_BARRIER   __asm nop;
#endif

しかし、ノーオペレーション操作がどのように機能してメモリバリアを生成するのかわかりませんか? または、それは単なる障害の実装ですか?

4

1 に答える 1

8

これは、完全なハードウェア メモリ バリアではなく、コンパイラ バリアです。つまり、コンパイラが最適化できない不透明な呼び出しになることを意図していますが、メモリの並べ替えに関してハードウェアに影響を与えることはありません1。問題のコンパイラが実際に asm ブロックを不透明として扱う場合、その目的のために正しく定義されている可能性があります (たとえば、gcc asm ブロックには、ブロック全体で変更できるものを正確に定義するための特定の規則があるなど)。

このコードが対象とするハードウェアがメモリ操作を決して並べ替えない強力なメモリ モデルを持っていることがわかっている場合は、完全なメモリ バリア (通常、コンパイラとハードウェアの両方の並べ替えを抑制します) と呼ぶのが適切かもしれません。


1とはいえ、プログラムがシングルスレッドである場合や、マシンが興味深い順序変更を示さない場合 (たとえば、単純なインオーダー、非投機的 CPU または単一 CPU システム) の場合、このようなバリアは依然として十分である可能性があります。 .

于 2013-02-04T01:28:36.687 に答える