偽共有 - スレッド間での同一キャッシュラインの共有問題
- .NET の問題 : 偽共有
- http://msdn.microsoft.com/ja-jp/magazine/cc872851.aspx
メニイコア前提の話になるけど、複数のスレッドを立てて並列処理する際、コード上ではそれぞれのスレッドに別々のデータ(変数)を与えていても、キャッシュラインのサイズ以下の小さなデータだった場合、各スレッドが読み出すデータが同一キャッシュライン上に乗ったりなんかして、結果それらデータが各コアのL2,L1にキャッシュされた際、コヒーレンシを維持するための通信コストが頻繁に発生して、劇的に遅くなったりすることがあるよ。って話。いかにしてこの問題が起きていないか発見するかっていう方法まで載ってるけど、まぁどうでもいいや。
ちょっと気になって調べてみたけど、現行のx86プロセッサってキャッシュラインサイズ64byteなんだよなぁ。。。自分なら、これ以下のサイズの小さなデータを各スレッドにバラバラと分け与えるとかないわー。って思った。なんか効率悪そうじゃん*1。
関係ないけど、"偽共有"って単語聞きなれないなぁ、っていうか実態にいまいち即してない気がするネーミングやん、ってことで同じ意味の単語(邦訳)を探してみたら
- HP-UX パラレル プログラミング ガイド > 第9章 トラブルシューティング > 誤ったキャッシュラインの共有
- http://docs.hp.com/ja/B3909-90032/ch09s02.html
- Sun Studio 12: OpenMP API ユーザーズガイド > 6.2 「偽りの共有」とその回避方法
- http://docs.sun.com/app/docs/doc/820-1217/aewcx?l=Ja&a=view
"誤ったキャッシュラインの共有"っていう直球な訳とか、"偽りの共有"っていう、、、あ、これは偽共有と一緒か。個人的には、"意図しない共有"とかの方がいいじゃんとか思った。今思いついたんだけど。
それはさておき、
配列は、メモリ内に行優先順で連続して保存されます。これは、マトリックスの各行がメモリ内で線状に順次レイアウトされるイメージです。
ってのが初耳だったので勉強になった。行単位で連続したアドレスに割り振ってる感じになるのか。覚えとこっと。
*1:特に何かを考えて言ってるわけではなく思いつき