29

これに関しては、私は初心者です。次のメモリバリアの違いを簡単に説明できる人はいますか?

  • MemoryBarrier();
  • フェンス_mm_mfence();
  • インライン アセンブリasm volatile ("" : : : "memory");
  • 本質的な_ReadWriteBarrier();

簡単な説明がない場合は、良い記事や本へのリンクがあれば、おそらくそれを理解するのに役立つでしょう. 今までは、これらの呼び出しをラップする他の人が作成したオブジェクトを使用するだけで問題ありませんでしたが、基本的にメモリバリアを実装する方法は複数あるという現在の考え方よりもよく理解したいと思います。

4

2 に答える 2

31

MemoryBarrier(MSVC)と_mm_mfence(複数のコンパイラでサポートされている)の両方がハードウェアメモリフェンスを提供し、プロセッサがフェンスを越えて読み取りと書き込みを移動するのを防ぎます。

主な違いは、MemoryBarrierにはx86、x64、およびIA64のプラットフォーム固有の実装があるのに対し、_mm_mfenceは特にmfenceSSE2命令を使用するため、常に使用できるとは限らないことです。

x86とx64では、MemoryBarrierはそれぞれxchgとで実装されておりlock or、これはmfenceよりも高速であるという主張をいくつか見ました。しかし、私自身のベンチマークは反対を示しているので、明らかにそれはプロセッサモデルに大きく依存しています。

もう1つの違いは、mfenceは非一時的なストア/ロード(movntqなど)の注文にも使用できることです。

GCCには__sync_synchronize、ハードウェアフェンスを生成するものもあります。

asm volatile ("" : : : "memory")GCCおよび_ReadWriteBarrierMSVCでは、コンパイラレベルのメモリフェンスのみが提供され、コンパイラがメモリアクセスを並べ替えることができなくなります。これは、プロセッサが自由に並べ替えを実行できることを意味します。

コンパイラフェンスは通常、ある種の暗黙的なハードウェアフェンスを持つ操作と組み合わせて使用​​されます。たとえば、x86 / x64では、すべてのストアにリリースフェンスがあり、ロードには取得フェンスがあるため、load-acquireとstore-releaseを実装する場合はコンパイラフェンスが必要です。

于 2012-01-13T03:23:54.903 に答える
5

フェンスのハードウェア レベルのセマンティクスに関するこちらの回答を参照してください。言及されていないのは、コンパイラ レベルとハードウェア レベルの両方で、フェンスをまたがるロード、ストア、またはロードとストア (フェンスに応じて) の並べ替えも防止することです。

于 2012-01-13T07:30:41.517 に答える