インテルCore i7 2600Kという4コア8スレッドのCPUを手にいれたので、並列処理でどうなるか試してみたら、面白い結果に。
Intel CPU Core i7 i7-2600K 3.4GHz 8M LGA1155 SandyBridge BX80623I72600K
- 出版社/メーカー: インテル
- 発売日: 2011/01/09
- メディア: Personal Computers
- 購入: 2人 クリック: 58回
- この商品を含むブログ (6件) を見る
ソースは最後に載せますが、1億5千万件のint数値を複数回合計するという処理を行って、時間を計測してみました。
メモリは8GBで、VMオプションには-Xmx2048mを指定しています。
Java VMは、JDK7ea b140です。
で、Ubuntu10.04の32bit版で実行した結果。
--- result --- 1 threads:15.451201(s) 2 threads:8.184938(s) 4 threads:6.324816(s) 6 threads:6.993831(s) 8 threads:6.587393(s)
1スレッドから2スレッドにすると倍近くに、2スレッドから4スレッドでも1.3倍程度に速くなってます。ただ、6スレッド・8スレッドでは速度改善はありませんでした。条件分岐もなくただ足し算繰り返すだけでなのでHT効きづらいのかなーと思いますが。
※ 32bitなので、メモリは3.5GBくらいしか認識していませんが、メモリの余裕はありました。
まあ、これだけなら、4コアまで伸びたけどハイパースレッドきかなかったねーとなるわけですけど、OSかえたら面白い結果になりました。
Windows7 64bit版でやってみました。
--- result --- 1 threads:6.930770(s) 2 threads:6.020648(s) 4 threads:6.175338(s) 6 threads:6.133848(s) 8 threads:6.160824(s)
なんだか、1スレッドのときからUbuntu 32bitでの4スレッドと同レベルの速度です。で、2スレッドで1.15倍ほど速度改善しますが、あとはむしろ悪くなります。
これが、Windows7がエラいのか、64bitにしたからなのかが気になりました。
ということで、Ubuntu 10.04 64bit版をUSBメモリに入れてみて試してみました。
--- result --- 1 threads:6.862185(s) 2 threads:5.982360(s) 4 threads:6.061102(s) 6 threads:6.126239(s) 8 threads:6.152392(s)
Windows7 64bitとだいたい同じで、ちょっと速いかなーくらいの結果になっています。
この、Ubuntu 32bitとUbuntu 64bitでの結果を統一的に説明できるような原因が、まったくわからんのですけど、だれか教えてえらい人
追記1 コメントのおかださんの結果のグラフです
6コア12スレッド!
SUM_TIMES = 30になっていたときの結果なので、時間は短くなっていますが、2600K 3.4GHzだと2スレッド以上で速くなったときに1.8秒だったので、倍近く速い!
HTは効いてませんね。
ソースです。
JDK7の数値のアンダーバー区切りのおかげで、大きい数値が見やすいです。
集計は10試行の最初3試行を捨てて、最大値と最小値を省いた5試行の平均になっています。
最初SUM_TIMES = 30になってたのですが、計測時と同様100に修正しました。試すときは30でも傾向かわらないので、そっちのほうが時間くわなくていいと思います。