マルチスレッド化の実験中
開発用マシンのCPUをCore 2 Duo E6850(3GHzのデュアルコア)からCore 2 Extreme QX6700(2.66GHzのクアドコア)に変更しました。やっぱり、学習用マシンが4コア8スレッドなのに開発用マシンが2コアだと、スレッド数に差がありすぎて開発の効率が悪いので。
んで、マルチスレッド化。まだ実験というか、勉強用コード兼ベンチマークを作って、色々実験してました。
とりあえず次の3種類のコードで、並列化した場合の速度を調べてみました。
- InterlockedIncrementを使用(アトミックにインクリメントしつつ値を取得)
- InterlockedCompareExchangeを使用(スピンロック)
- CriticalSection(Win32 APIのやつ)
以下、3種類のコード(ロックまわり以外は共通)をCore i7で動かした場合の処理時間*1と、1スレッド動作時からの性能向上率。
あ、各スレッドはSetThreadAffinityMaskを適当に設定して、それぞれ別のコアで走らせてます。ついでに、1〜4スレッド動作時は同じ物理コアで動作しない様になってるはずです。
1スレッド | 2スレッド | 4スレッド | 8スレッド | |
InterlockedIncrement | 18.683sec | 9.897sec(x1.88) | 5.025sec(x3.71) | 4.398sec(x4.24) |
InterlockedCompareExchange | 18.583sec | 9.847sec(x1.88) | 5.020sec(x3.70) | 4.460sec(x4.16) |
CriticalSection | 18.643sec | 9.936sec(x1.87) | 5.532sec(x3.37) | 6.297sec(x2.96) |
8スレッド時の処理時間は絶対値も伸び率もInterlockedIncrementがベストなので、とりあえずこれを使うのを基本としてやっていきます。
スピンロックを使っても8スレッド動作時にあんまり性能落ちてないですけど、これは不思議。まぁ、落ちないならそれにこした事はないので、別に良いんですが。
それから、CriticalSectionはなぜか4スレッド→8スレッドで性能低下。タスクマネージャでCPU使用率を見てても、100%行ってなくて遊んでる感じでした。同じく原因不明、追求する気無し。
/* 以下、2009/02/05 20:48追記 */
書き忘れてましたが、Turbo Modeが働くので1スレッド動作時は3.2GHz、それ以外は3.07GHzでの動作です。
*1:3回はかった中央値