キャッシュフラッシュがあってもメモリバリアが実装されているアーチはありますか? メモリバリアは CPU の並べ替えにのみ影響することを読みましたが、メモリバリアに関連するステートメントを読みました:すべての cpu が値を確認できるようにします...、しかし私にとっては、キャッシュのフラッシュ/無効化を意味します。
2 に答える
ほとんどすべての最新のアーキテクチャでは、キャッシュ (L1 キャッシュや L2 キャッシュなど) はハードウェアによって一貫性が保証されています。他の CPU がメモリを認識できるようにするためにキャッシュをフラッシュする必要はありません。
ハードウェアでキャッシュ コヒーレントでないシステムを仮説的に想像することはできますが、Windows や Linux などのオペレーティング システムを実行している現在のシステムとはまったく異なります。
これらのアーキテクチャでは、次の 3 つのことを行うためにメモリ バリアが必要です。
CPU は、別のコアへの書き込みによって無効化された読み取りをプリフェッチする場合があります。これを防止する必要があります。(ただし、x86 では、これはハードウェアで防止されます。プリフェッチは L1 キャッシュ ラインにロックされているため、別の CPU がキャッシュ ラインを無効にすると、プリフェッチも無効になります。)
CPU は書き込みを「ポスト」し、まだ L1 キャッシュに入れていない可能性があります。これらの書き込みは、少なくとも L1 キャッシュに対して完了する必要があります。
CPU は、メモリ バリアの片側で読み取りと書き込みの順序を変更し、反対側で読み取りと書き込みを行う場合があります。メモリ バリアの種類によっては、これらの並べ替えの一部を禁止する必要があります。(たとえば
read x; read y;
、読み取りがその順序で行われることは保証されませんが、read x; memory_barrier(); read y;
通常は行われます。)
メモリバリアの正確な影響は、特定のアーキテクチャによって異なります
CPUは、パフォーマンスの最適化を採用しているため、実行が順不同になる可能性があります。メモリ操作(ロードとストア)の並べ替えは、通常、単一の実行スレッド内では見過ごされますが、注意深く制御しない限り、並行プログラムとデバイスドライバーで予期しない動作を引き起こします。順序付け制約の正確な性質はハードウェアに依存し、アーキテクチャのメモリ順序付けモデルによって定義されます。一部のアーキテクチャは、さまざまな順序の制約を適用するための複数の障壁を提供します。
http://en.wikipedia.org/wiki/Memory_barrier
現在のIntelアーキテクチャは、メモリバリアやキャッシュフラッシュ命令を明示的に使用することなく、すべてのCPUで自動キャッシュ整合性を保証します。
対称型マルチプロセッサ(SMP)システムでは、各プロセッサにローカルキャッシュがあります。メモリシステムは、キャッシュコヒーレンスを保証する必要があります。異なるプロセッサ上のスレッドが同じキャッシュラインにある変数を変更すると、偽共有が発生します。これにより、キャッシュラインが無効になり、強制的に更新され、パフォーマンスが低下します。
http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads/