質問

明示的なメモリフェンスを使用するとはどういう意味ですか?

役に立ちましたか?

解決

パフォーマンスを向上させるために、最新のCPUは、使用可能なシリコンを最大限に活用するために(メモリの読み取り/書き込みを含む)命令を誤って実行することがよくあります。ハードウェアは命令の整合性を強制するため、実行の単一スレッドでこれに気付くことはありません。ただし、複数のスレッドまたは揮発性メモリ(たとえば、メモリマップI / O)を使用する環境では、これは予測できない動作を引き起こす可能性があります。

メモリフェンス/バリアは、メモリの読み取り/書き込みが予期した順序で発生することを意味する命令のクラスです。たとえば、「フルフェンス」は、フェンスの前のすべての読み取り/書き込みが、フェンスの後の読み取り/書き込みの前にコミットされることを意味します。

メモリフェンスはハードウェアの概念です。高レベルの言語では、ミューテックスとセマフォの処理に慣れています。これらは低レベルのメモリフェンスを使用して実装することができ、メモリバリアの明示的な使用は必要ありません。メモリバリアを使用するには、ハードウェアアーキテクチャを慎重に検討する必要があり、アプリケーションコードよりもデバイスドライバーでよく見られます。

CPUの並べ替えは、コンパイラの最適化とは異なりますが、アーティファクトは似ている場合があります。望ましくない動作を引き起こす可能性がある場合(Cでvolatileキーワードを使用する場合など)、命令を並べ替えるコンパイラーを停止するには、個別の対策を講じる必要があります。

他のヒント

私の回答をコピー別の質問、へのトリックプロセッサーがコードを最適化するために行うこと

  

最も重要なのは、メモリアクセスの順序変更です。

     

メモリフェンスまたはシリアル化命令がない場合、プロセッサはメモリアクセスを自由に並べ替えることができます。一部のプロセッサアーキテクチャでは、並べ替え可能な量に制限があります。アルファは最も弱い(つまり、最も順序を変更できる)ことで知られています。

     

この件についての非常に良い扱いは、Linuxカーネルソースドキュメントの Documentation / memory-barriers.txt

     

ほとんどの場合、コンパイラまたは標準ライブラリのロックプリミティブを使用することをお勧めします。これらは十分にテストされており、必要なすべてのメモリバリアが適切に配置されている必要があり、おそらく非常に最適化されています(ロックプリミティブの最適化は注意が必要です;エキスパートでさえ間違っていることがあります)。

私の経験では、メモリバリアを指します。これは命令(明示的または暗黙的)複数のスレッド間でメモリアクセスを同期します。

問題は、最新のアグレッシブなコンパイラ(命令を並べ替える驚くべき自由がありますが、通常はスレッドについては何も知りません)と最新のマルチコアCPUの組み合わせで発生します。

問題の良い紹介は" Double-Checked Locking is Broken 'Declaration "。多くの人にとって、それはドラゴンがいるというモーニングコールでした。

通常、暗黙的な完全なメモリバリアは、プラットフォームスレッド同期ルーチンに含まれ、そのコアをカバーします。ただし、ロックのないプログラミングとカスタムの軽量同期パターンの実装には、多くの場合、バリアのみ、または一方向のバリアのみが必要です。

ウィキペディアはすべてを知っています...

  

membarとも呼ばれるメモリバリア   またはメモリフェンス、のクラスです   セントラルを引き起こす指示   処理ユニット(CPU)   メモリの順序制約   前後に発行される操作   バリア命令。

     

CPUはパフォーマンスの最適化を採用しています   その結果、順序が狂う可能性があります   メモリ負荷を含む実行   ストア操作。メモリ操作   通常、並べ替えは見過ごされます   単一の実行スレッド内で、   しかし、予測不能な動作を引き起こします   並行プログラムとデバイスドライバー   注意深く制御しない限り。正確な   順序制約の性質は   ハードウェアに依存し、   アーキテクチャのメモリモデル。一部   アーキテクチャは複数を提供します   異なる実施の障壁   順序の制約。

     

メモリバリアは通常使用されます   低レベルのマシンを実装する場合   によって共有されるメモリ上で動作するコード   複数のデバイス。そのようなコードには   同期プリミティブと   ロックフリーのデータ構造   マルチプロセッサシステム、およびデバイス   コンピューターと通信するドライバー   ハードウェア。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top