非同期デリゲートを用いた並列計算の結果に関する考察(1)

最初に

ふだんの研究で用いている集光光学素子での波動伝播シミュレーションの計算(フレネル・キルヒホッフ回折積分)を非同期デリゲートを用いて並列化しました。
http://d.hatena.ne.jp/kaminarioyaji/20081223/1230056152

並列化の効果の程を確認するため、研究室内のPCを用いて計算を行いまとめてみました。結果、CPUのマイクロアーキテクチャによって明確な差が見られました。この結果について考察を行い、それをもとにコードをさらに改良してみました(これについては次回)。

結果と感想

実行環境はPCによって大きくバラついているのですが、1機種を除いて環境の違いによる有意な差は見受けられなかったので、特に揃えていません。これについては考察で後述しますが、今回の計算(1000x5000回のフレネル・キルヒホッフ回折積分計算)ではL2キャッシュ内に実行コードが収まっており、このため、あまり他のプログラムの影響を受けることなく、ほぼCPU性能*1のみで処理時間が決まっていると思われます。
計算は、すべて倍精度、プログラムは、.NET Frameworkで実行しています。主にFPU性能の違いを見ている、かと思ったのですが結果を見た感じでは何か違うものを見ているのかも・・・。

単純比較

まずは各CPUでかかった処理時間の一覧。紫色が計算にシングルコアのみ使用したときの結果、薄紫色が(デュアルコアの場合)コアを2つとも使用したときの結果になります。バーが短いほど高速なCPUとなります。


図1: 計算に使用したスレッド数を変更したたときの処理時間(クリックで拡大)

とりあえずCeleronD*2、遅すぎ・・・。この日記を書いてて思い出したけど、このPCにはUSB-VGAアダプタ*3を増設しているのでそれが原因かなぁ。。。いくらなんでも、同じアーキテクチャPentium4やPentiumDに対して遅すぎるし。

PentiumMは、動作周波数が低いこともあり最遅ですが、動作周波数が倍以上あるCeleronDとあまり変わらないことを考えると、よく出来たアーキテクチャなんだなぁと。(今更ですが、高クロックでIPCの低さをカバーすることを目標としていたNetBurstアーキテクチャはイマイチすぎる・・・)

処理にかかった時間で見れば、Pentium4(NetBurst) ≒ Athlon64X2(K8)ですが、K8アーキテクチャ群は動作周波数が低いことを考慮すると優秀だなぁと。

Core2はやっぱり速いなぁって感じで。特に言うことないです。

大雑把にみてアーキテクチャごとの性能は、NetBurst<<PentiumM<K8<Core2という感じで、見事なまでに歴代順というか、世間で言われている評価通りになりました。

並列化効果の比較

上記結果を見ているとCPUによって並列化による改善具合が明らかに違うことに気づいたので、"1スレッドでの処理時間/2スレッドでの処理時間"をグラフにまとめてみました。結果は周波数に依存しないはずなので、CPUを開発コア名で記載しています。


図2: 2スレッドでの計算時の処理時間改善具合(クリックで拡大)

PentiumM、CeleronDのシングルコアで、さほど性能が落ち込まなかったので結構うまく並列化できたのかなぁと。勝手に自己満足。

Prescott-2M(Pentium4 640)は、デュアルコアではなく、HyperThreading(HT)による論理CPU2個になります。一般に言われている「HTの効果はシングルコアの1.3倍程度」、を大きく越えて1.5倍程度の性能向上が見られたので、結果を見たとき、一瞬(゜д゜ポカーン としていました。

今回1番の問題だったのですが、PentiumD・Athlon64X2では、1.5〜1.6倍と思ったほど改善されませんでした。(これについては、次回の日記に書きますが、現在は原因が判明しており、理論値通りほぼ2倍の性能が出るよう改善しました。)

Core2では、ほぼ理論値通り(単純に2倍)の結果になりました。Core2マジパネェ。。。Meromだけ伸びが悪いですが、これはPCの環境*4のせいかと思っています。

CPUマイクロアーキテクチャごとの性能比較

アーキテクチャごとの違いを定量的に見てみたくなったので、シングルスレッドでの処理時間の逆数を動作周波数[GHz]で割った値をグラフにまとめてみました。図2と同じく、CPUは開発コア名で記載しています。なお、CPUの並び順は図1,2と逆にしています。


図3: クロック当たりの性能 (クリックで拡大)

Core2が最も速いのですが、中でも最新のCore2(Wolfdale/Penryn)が頭1つ抜け出る結果になりました。相変わらずCore2パネェ・・・。

こうしてみると、K8も意外と速いんだなぁと思えたり。現在の家用PCがAthlon64X2なのですが、Core2に買い換えずにK10買って延命するのもいいかもなぁと思いました。

NetBurstは・・・、もういいです。

PentiumM、よく出来てるなぁと思うと同時に、PentiumM→Core2で着実にアーキテクチャが改良されてるなぁとか。

*1:おそらくFPU・ALU性能とL2$の効率、、、かなぁ

*2:研究室で自分が使ってるPC・・・orz

*3:BUFFALO GX-DVI/U2

*4:常駐物が多く、使っていて体感で遅い