Documentation
¶
Overview ¶
False Sharingについてのサンプルです。
False Sharingとは「別々の変数を触っているのに、たまたま同じキャッシュラインに乗っているせいで、キャッシュコヒーレンシが暴れて性能が落ちる現象」のこと。 マルチコアCPUの環境で、一つの構造体の別々のフィールドを別々のスレッドで個別に更新する処理などを書いたりしている場合に良く発生します。 数回更新されるだけの処理なら問題ありませんが、例えば何万回、何千万回も更新されるフィールドの場合などは塵積で差が出てきます。
キャッシュコヒーレンシとは「複数のキャッシュに載っている“同じメモリ位置のデータ”の内容を、常に矛盾なく保つための仕組み・性質」のことです。 マルチコアCPUでは、各コアがそれぞれL1/L2キャッシュを持ち、同じアドレスのデータをローカルにキャッシュします。 どれかのコアがそのデータを書き換えたときに、他コアのキャッシュ内容も古いままにならないように 「同じアドレスならどのコアから見ても同じ値になる」ことを保証するメカニズムがキャッシュコヒーレンシです。 False Sharingが発生している場合は、これが何回も発生します。
多くのアーキテクチャでキャッシュラインサイズは 64 バイトです。 なので、同じキャッシュラインに入っている値を、別々のスレッドで更新するとキャッシュコヒーレンシが発生します。 一つのスレッドが更新するたびに、同じキャッシュラインをコピーして保持しているスレッド全部に発生するため、性能が落ちていきます。
回避策はそれぞれ別のキャッシュラインに載るように適切にパディングしたりすることです。
REFERENCES: