2017-07-06 3 views
1

私は別のスレッドが絶えずそれからデータを読み込むだけのためにいくつかの小さな共有配列を使用するOpenMP並列、とC++のプログラムを持っている場合は、偽の共有が、この場合に発生しますか。言い換えれば、メモリ書き込み操作にのみ関連する誤った共有であるか、またはメモリ読み取り操作でも起こり得る。openmpでデータを読み込んだときに誤った共有が行われますか?

+0

私の知る限りフォルス・シェアリングは、それが変更をしたデータと同じページ上にあるため、変更didntのデータのリロードに、不要な程度です。何も書かれていない場合は、次に何をリロードする必要はありません。したがって、偽共有 – user463035818

+0

は、ここを参照してくださいません:https://en.wikipedia.org/wiki/False_sharing – user463035818

+0

私はいくつかのスレッドが動作しているとき、心の中で偽の共有ケースを持っていました同じキャッシュラインを使用し、プロセッサは、コヒーレンシを維持するためにそれらを同期させなければならない。ここで述べるように、http://www.drdobbs.com/architecture-and-design/sharing-is-the-root-of-all-contention/214100002 –

答えて

2

典型的に使用されるキャッシュ・コヒーレンス・プロトコルなどMESI(修飾された、排他的、共有、無効)、と呼ばれるキャッシュラインのための特定の状態が「共有」を有します。キャッシュラインは、複数のプロセッサによって読み込まれる場合、この状態になります。各プロセッサは、キャッシュラインのコピーを持ち、誤って共有することなく安全に読み取ることができます。書き込みでは、すべてのプロセッサは、偽共有

+0

これは、スレッドごとにこの配列のローカルコピーを作成するとパフォーマンスが向上しないことを意味しますか? –

+1

実際のハードウェアに依存しますが、パフォーマンスは向上しません。私はマイクロベンチマークを書くことを提案します – max

+1

私はそれについて少し考えました。キャッシュの使用率が高いため、データのコピーはおそらくさらに悪化する可能性があります。ほとんどの場合、小さなL1キャッシュだけがコアプライベートです。インクルーシブキャッシュでは、より高いレベルのキャッシュに冗長データがあります。 – max

3

偽共有のための主な原因であるキャッシュラインを無効化するために通知され、それには時間がかかるキャッシュラインの追加の動きが発生するため、パフォーマンスの問題です。実際に共有されていない2つの変数が同じ行にあり、スレッドを別々に更新すると、その行はマシンの周りを跳ね返り、各アクセスの待ち時間が長くなります。この場合、変数が別々の行にある場合、各スレッドはローカルで変更された "その"行のコピーを保持し、データの移動は必要ありません。

ただし、行を更新していない場合は、データの移動は不要で、共有からのパフォーマンスの影響はありません。実際には、各スレッドが必要とするデータデータではありません。これは小さな2次効果です。しかし、。あなたが知っていない限り、キャッシュ容量は制限されています!

関連する問題