8

異なる変数が同じキャッシュ ライン内にある場合、False Sharingが発生する可能性があります。つまり、2 つの異なるスレッド (異なるコアで実行されている) が 2 つの異なる変数にアクセスしていても、それらの 2 つの変数が同じキャッシュ ラインに存在する場合、キャッシュの一貫性がトリガーされるたびに、パフォーマンスが低下します。

ここで、これらの変数がアトミック変数であるとします (アトミックとは、C++ の などのメモリ フェンスを導入する変数を意味しますatomic<t>)、そこで false 共有が問題になるか、アトミック変数が同じキャッシュ ラインにあるかどうかは問題ではありません。いずれにしても、キャッシュの一貫性が導入されると思われます。つまり、アトミック変数を同じキャッシュ ラインに配置すると、同じキャッシュ ラインに配置しない場合よりもアプリケーションが遅くなりますか?

4

3 に答える 3

7

明確化: 否定的な結果を得るには、少なくとも「誤って共有された」変数へのアクセスの一部を書き込みにする必要があります。書き込みがまれな場合、偽共有によるパフォーマンスへの影響はごくわずかです。より多くの書き込み (およびキャッシュ ラインの無効化メッセージ) が発生すると、パフォーマンスが低下します。

アトミックであっても、キャッシュ ラインの共有 (false または true) は依然として重要です。http://www.1024cores.net/home/lock-free-algorithms/first-things-firstで証拠を探してください。したがって、答えは - はい、異なるスレッドで使用されるアトミック変数を同じキャッシュラインに配置すると、それらを 2 つの異なるラインに配置する場合に比べてアプリケーションが遅くなる可能性があります。ただし、アプリがこれらのアトミック変数の更新にかなりの時間を費やさない限り、ほとんど気付かれないと思います。

于 2012-04-13T15:31:02.417 に答える
1

最も強力な整合性要件 (完全なメモリ バリア) でアトミック変数を使用する場合、偽共有の影響はおそらく目立たないでしょう。このようなアクセスの場合、アトミック操作のパフォーマンスは、基本的にメモリ アクセス レイテンシによって制限されます。とにかく物事は遅いです。偽の共有が存在しても、それほど遅くなるとは思いません。

他のあまり邪魔にならないメモリ順序付けがある場合、アトミック自体によるパフォーマンスへの影響は少なくなる可能性があるため、偽共有の影響は重大になる可能性があります。

全体として、アトミック操作の偽共有について心配する前に、まずアトミック操作自体のパフォーマンスを確認します。

于 2012-04-13T16:06:49.367 に答える
0

アトミック変数を同じキャッシュラインに配置すると、同じキャッシュラインに配置しない場合よりもアプリケーションの速度が低下しますか?

「アトミック」変数の誤った共有は、パフォーマンスの問題につながる可能性があります(そのような問題つながるかどうかは、多くのことに依存します)。

2つのコアとがAありB、それぞれが独自の変数で動作するとします。aこれらの変数をbそれぞれと呼びましょう。

Aaキャッシュにあり、キャッシュにありBますb

A増分するとどうなるかを考えてみましょうa

  • aキャッシュラインをb共有している場合、の Bコピーはb無効になり、への次のアクセスbでキャッシュミスが発生します。
  • キャッシュラインを共有しない場合abBキャッシュされたコピーに関する限り、影響はありませんb

aこれは、とbが「アトミック」であるかどうかに関係なく発生します。

于 2012-04-13T15:45:16.610 に答える