2

ここでメモリフェンシングについて読みました...そして、それについて少し説明が必要です

asm volatile ("" : : : "メモリ")

これにより、コンパイラ レベルのメモリ フェンスが提供され、プロセッサはこれを使用しても並べ替えを実行できます。

同様の命令でコンパイラレベルのフェンシングとプロセッサレベルのフェンシングの両方を達成できる方法はありますか?

私は遭遇しました、

asm volatile("sfence" : : : "メモリ")

これは何をしますか?コンパイラ レベルのストア フェンシングのみを提供しますか?

これに関する情報は非常に役立ちます。

ありがとう

4

1 に答える 1

4

これらは、概念的に関連しているが機能的に異なる 2 つのアクションを実行します。

asm volatile ("" : : : "memory")

その時点でメモリ アクセスの順序を変更しないようにコンパイラに指示します (それ以外の場合は、最適化のために自由に実行できます)。これにより、コードに書き込まれたロードとストアが、その時点までに終了することが保証されます。コード。

asm volatile("sfence" : : : "memory")

実際の Intel ファミリの CPU コマンド (sfence) であり、最適化のためにストアを並べ替えないようにハードウェアに指示します (lfence および mfence ハードウェア命令もあります)。「メモリ」制約を追加すると、メモリアクセスの順序も変更しないようにコンパイラに指示されます。

ウィキペディアでは、この件についてまともな扱いをしています (http://en.wikipedia.org/wiki/Memory_barrier)。もう少し詳しく知りたい場合は、Intel プログラマーズ マニュアル (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/) を確認してください。

于 2012-08-14T09:45:19.903 に答える