マルチコアと同期
スレッドごとのカウンタを「long cnt[8];」のように並べた配列で偽共有が起きている。対策として最も適切なものはどれか。
- Aカウンタの型をlongからintに変えて、配列を小さくする
- B各カウンタの間に詰め物を入れたり整列させたりして、別々のキャッシュラインに置く
- Cスレッドの数を増やして、待ち時間を分散させる
答えと解説を見る
正解:B. 各カウンタの間に詰め物を入れたり整列させたりして、別々のキャッシュラインに置く
longが8バイトなら、8個のカウンタは64バイトの1つのラインに収まり、全部のスレッドが同じラインを奪い合います。各カウンタを64バイトごとに置くように詰め物を入れるか、構造体をキャッシュラインの大きさに整列させれば、スレッドごとに別のラインを使えます。また、各スレッドは局所変数で数えて、最後に1回だけ共有の場所へ足す方法も効果的です。
- A. 小さくすると、かえって同じラインに詰め込まれます。
- B. 正しい。ラインを分ければ行き来がなくなります。
- C. スレッドが増えると、行き来はむしろ増えます。