4コア8スレッドマシンのメモリを2枚から4枚に増やしたらいろいろわかった

メモリを増やしてみました

先日4コア8スレッドのマシンでいろいろ試してみたら、なんだか不思議な結果になりました。
4コア8スレッドCPUを手に入れたので試してみたら不思議な結果に - きしだのはてな


その後、いろいろやってみてメモリのボトルネックじゃないかということで、ためしにメモリを4G×2枚増やして合計16GBにしてみました。
しかし、8GBで8千円ってすごいですねー

結果

昨日と同様に、Core i7 2600K、JDK7-ea-b140で試してみました。
まず、Ubuntu10.04の32bit版です。4スレッドからの性能があがりました!ハイパースレッディングもちょっと効いています。

 --- result ---
1 threads:15.401835(s)
2 threads:7.825008(s)
4 threads:4.228158(s)
6 threads:3.999717(s)
8 threads:3.942870(s)


さて、次にWindows7 64bit版。2スレッドからの性能があがっています。

 --- result ---
1 threads:5.814105(s)
2 threads:3.398303(s)
4 threads:3.290159(s)
6 threads:3.438094(s)
8 threads:3.316317(s)


最後にUbuntu10.04 64bit版。Windows7 64bit版と同じ傾向ですが、あいからわず、ちょっとだけ速いです。

 --- result ---
1 threads:5.659372(s)
2 threads:3.308223(s)
4 threads:3.259219(s)
6 threads:3.451276(s)
8 threads:3.334100(s)

考察

ということで、メモリを増やしたら速くなりました!
前回、4GB×2枚のときは、結局32bit版も64bit版も6秒程度で頭打ちになっています。ここがメモリ転送の限界ということだったようです。

Twitterid:shinさんに指摘されたのですが、longの足し算を行っているので、32bitから64bitにすると処理速度が倍になったんじゃないかと。
つまり、32bit版で64bit計算を行っている間メモリ転送には余裕ができていて、2スレッドにするとその余裕がなくなり頭打ちになり、64bit版では最初からメモリ転送に余裕がない速度になっていたので、2スレッドにしても速くならなかったと。


4GB×4枚にすると、3秒程度に限界があがっています。32bit版では4スレッドでも余裕があって、ハイパースレッディングが効いた6スレッドでも少し改善して、そこで限界になったという感じでしょうか。
64bit版では、2スレッドでメモリ転送の限界になってしまっているようです。


また、コメントくださってたおかださんに、6コア12スレッドマシンでの3スレッドでの性能も見ていただくと、次のような結果になって、3スレッドまでは性能が伸びています。

1 threads:6.070004(s)
2 threads:3.946953(s)
3 threads:3.171499(s)
4 threads:3.046267(s)
6 threads:2.996293(s)
8 threads:3.011232(s)
10 threads:3.033973(s)
12 threads:3.163925(s)


i7 2600Kがデュアルチャネルで、おかださんのはXeon W3680ということで、こちらはトリプルチャネルで、それぞれ2スレッド、3スレッドの時点でチャネルを使いきってしまったのではないかと思います。
4GB×2の状態では、片側のチャネルにデータが固まっていたものが、4GB×4で両方のチャネルにデータが分散したといえそうです。


おかださんのMacのほうはメモリ3枚ということなんですが、データの割り振りがいいのか、トリプルチャネルだからか、最初から効率が出ていますね。
Xeon W3680が3.3GHzで、i7 2600Kが3.4GHzなので、シングルスレッドや2スレッドでは2600Kのほうが少し速いのですが、3スレッドからはメモリチャネル数の差でXeon W3680のほうが速くなっているといえそうです。

まとめ

メモリコントローラーの特性などにもよると思うのですが、メモリの物理的な数を増やすことが、スレッド性能に効果あるということがわかりました。
ただ、バンク(枚数)を増やしたことがよかったのか、チップ数が増えたからなのかはわかりませんが。
(追記2011/5/8:すんません、メモリ2枚のとき、両方チャネル0のソケットに挿していたのが原因でした。いまマザーボードの説明書見ました。プリキュアみながら ><)
あと、Ubuntu 32bitは、32bitOSなのでメモリを3.4GBまでしか認識していないのですが、それでもメモリ増設で効果がでたのがおもしろいです。


今回、メモリの開封時にホッチキスの針で親指を刺してしまい、メモリを装着したあとで指を見てみると血まみれになっていました。
メモリに親指の血を一滴たらしておくと、マシンの速度が改善されるということかもしれません。