CPU の数値計算性能について (2005 年)
はじめに
以前いくつかの CPU について数値計算能力を
調べたが新しい CPU がいくつか
登場しているのでそれらを含めて数値計算能力を調べてみた結果を記す.
基本的方針は前回と同様である.
方針,考え方について幾点かコメントする:
- MD (Molecular Dynamics) 計算のコードでの数値計算能力を調べる.
MD 計算ではおおざっぱに言えば処理としては非線型常微分方程式を
同時に自由度の数ほど数値的に解く.
- MD 計算の特徴としては非常に CPU に負荷をかけメモリが律速
段階になりにくい.メモリの負荷は自由度の数に依存し,これについて
も調べる.浮動小数点演算が主である.
- multitasking については以前比較してるが,オーバーヘッド
はわずかであり, 2 つ以上 thread を同時に走らせている場合には
全性能を job/thread 間で全てわけて使っていると考えて良い.
- 1 thread だけを走らせた場合だけは性能が全体の性能のどれだけであるか
が CPU に依存するのでこれについては次の項目で考察する.
- 全ての場合 OS は GNU/Linux (distribution, kernel は様々) である.
kernel 等への性能の依存はほとんど認められなかったが,これについ
ては別に系統的に比較する (予定である…).
- コードは C で書かれており, single threaded である.
- compiler は Intel の icc を使った (icc Version 8.0, icc -fast).
icc が gcc よりも速い実行コードを作るからである.
Intel, AMD 製 CPU ともに gcc -O3 では icc -fast の 6 割程度の性
能しか引き出せない.
(SPEC CPU の資料を見ても AMD が Intel compiler
を使って性能出している状況である!)
compiler option, icc/gcc については別途系統的に比較する
(予定である…).ただ,AMD64 に関して gcc で -m64, -mtune=k8 程度の
option を加えるだけでは性能向上は見られなかった.
- Pentium 4 については常に HTT (Hyper Threading Technology) を使
える状態に設定した.この方が 2 つ以上の thread を同時に走らせる
場合は性能を引き出せる.
- 計算時間に関しては time の user 時間を根拠に算出している.
CPU 性能の比較
参考のために比較をした CPU の spec を表 2 にまとめておく.
表 2: CPU specs
Manuf. |
CPU |
Model # |
Clock [Ghz] |
Chipset |
Memory bus |
Kernel |
L2 |
Intel |
Pentium 4 |
3.2GHz |
3.2 |
Intel 875P |
PC3200 Dual channel |
2.6.0 i386 smp |
512KB |
Intel |
Itanium 2 |
1.6GHz |
3.2 |
? |
? |
2.6.5 ia64 smp |
256KB |
AMD |
AthlonMP x 2 |
2200+ |
1.8 |
AMD760MPX |
PC2100 |
2.4.18 i386 smp |
256KB |
AMD |
Athlon64 |
3200+ |
2.0 |
K8T800 |
PC3200 Dual channel |
2.4.21 x86_64 |
1MB |
AMD |
Athlon64 |
3800+ |
2.4 |
K8T800Pro |
PC3200 Dual channel |
2.6.12 x86_64 |
512KB |
AMD |
Athlon64 |
4000+ |
2.4 |
K8T800Pro |
PC3200 Dual channel |
2.6.9 x86_64 |
1MB |
AMD |
Athlon64 dual core |
4800+ |
2.4 |
Nforce4 |
PC3200 Dual channel |
2.4.31 i386 smp |
1MBx2 |
CPU の性能を測定するために 2 つ以上 thread を同時に走らせる事により
CPU の性能を最大限に使っている.
1 thread だけを走らせる場合は特殊であり,
この場合については別個に以下で言及する.
まず MD の系の自由度の数とシミュレーションにかかる計算時間を図に示す.
基本的に自由度の数に計算時間が比例することがわかる.
この際,計算時間は 2 つ thread を同時に走らせ, CPU 1 個あたりの
計算時間とするので dual core/HTT では 1 thread あたりは半分になっている.
次に下のグラフで測定した計算時間を用いて CPU の性能を比較する.
わかりやすくするため P4-3.2 を「業界標準」として 1 に規格化する.
よって 2 であれば P4-3.2 の性能の 2 倍あるということである.
横軸は上のグラフと同様に横軸は自由度の数である.
性能の比較について気が付く点をまとめてみる.
- 自由度を増やすと基本的に性能比は変わらない.
AthlonMP だけ性能が落ちてくるがこれはメモリバスが遅い
からであろう.
- AMD64 の性能はモデルナンバーから考えると
このような数値計算では低めである.
4000+ が P4-3.2 に負けている.
- AMD64 X2 の性能は非常に高い.
4800+ は理論値通り 4000+ の 2 倍の性能をたたき出せる.
P4-3.2 を標準と考えると MD 数値計算用途だけならば 6000+ と
言っても良い.
- このような計算では 512KB と 1MB の cache size の有意
な差は見られなかった.(値段から考えると残念である.)
3800+ と 4000+ の性能が誤差内で一致している.
- 自由度が少ない場合に若干 P4-3.2 と AMD CPU との性能比が
若干 (1 割弱まで) ふらつくが,これはたまたま実行コードと
cache の大きさが合ったりする場合があるからではないだろうか.
1 thread を走らせた場合の性能について
1 thread を走らせた時に同じ CPU で 2 thread 以上走らせた場合に比較し
てどれだけ性能を引き出せるか以下の表にまとめた.
HTT, Dual core を持つ CPU の本来の 性能を 100% 使うためには
2 thread 以上同時に走らせることが必要である.
2 thread 以上であれば性能は基本的に同じであるので 1 thread 走らせる場
合がむしろ特殊とも言える.
その一方,主に 1 thread しか走らせないという状況は普通に生じるのでその性能を調べた.
参考のために dual CPU (物理的に CPU が 2個ある場合) も含めた.
表 1: 1 thread 時の性能
Manuf. |
CPU |
Model # |
Clock [Ghz] |
Chipset |
1 thread 時の性能 |
Comments |
Intel |
Pentium 4 |
3.2GHz |
3.2 |
Intel 875P |
0.74 |
HTT on |
AMD |
AthlonMP x 2 |
2200+ |
1.8 |
AMD760MPX |
0.5 |
CPU 2個 |
AMD |
Athlon64 |
4000+ |
2.4 |
K8T800Pro |
1 |
|
AMD |
Athlon64 dual core |
4800+ |
2.4 |
Nforce4 |
0.5 |
|
Comments:
- 従来の single core の
CPU (例: AMD 4000+) は常に CPU の性能を 100% 発揮
できて,2 つ thread を走らせれば半分づつ分けて使うだけである.
- dual CPU (例: Athlon MP x 2) は 2 つ物理的な CPU があるので 1
thread では性能を半分しか使えない.(1 thread では 1 つの CPU が
使われないからである.)
- dual core (例: AMD64 dual core) は物理的な CPU は 1 つであるが,
実質的に dual CPU と同じふるまいをする事がわかる.OS には CPU が
2 個あると認識されている.
- HTT (例: Pentium 4) は物理的な CPU は 1 つであるが dual core
同様に OS には CPU が 2 個あると認識されている.
dual CPU のようであるが 1 thread でも性能の 0.5 より多く使える.
- 同じ性能であれば 1 thread で CPU の性能の 100% を使えることが
望ましい.なぜならば,100% 使えればそれをどうわけて使うかを
こちらでコントロールできるからである.
dual CPU, dual core 等では使い方を 0.5 づつと制限を付けられてい
るとみなすことができる.
ただ,これは机上の空論であり,たとえば AMD dual core と同じ速度
を 1 thread, 同じアーキテクチャーで得ようとすれば(メモリの速度が
追い付いたとしても) 4.8GHz の CPU となり現状では物理的に作るこ
とが不可能な CPU になってしまう.
- Dual core/Dual CPU/HTT の性能をフルに使うためには 2 つ以上の thread
を同時に走らせることが必要である.
逆に同時に走らせれば性能は実質倍になる.
(たとえば AMDX2 4800+ は 8000+ の性能があるとも言えるが,
モデルナンバーは 2 割程度の multithreaded なアプリケー
ションを使うであろう,という付け方である.)
- 数値計算をする場合には 1 つのパラメーターのみで計算をするという
場合は珍しく,通常いくつかの場合 (違う大きさ,温度,etc) で
シミュレーションを行う.よって多くの場合,多少特殊な
multi-threaded programming をせずとも dual core でも
single-threaded なアプリケーションを 2 個以上同時に走らせること
で 100% 性能を使いきれる.
- 通常の使い方では 1 つしか thread を使わない場合が多いが,
次第に 1 つのアプリケーションでいくつもの thread を使うように
設計されることが多くなり,cpu intesive な仕事では
性能を十分に発揮できるようになると考えられる.
(multithreading 自体は古い概念であり,Windows でも
multitasking ができるようになった 10年暗い前から
盛んに言われてきたことである.)
- 今回の表だけには Itanium 2 も比較に含めた.
2 つ以上の thread を走らせた場合は通常の single core の CPU
としてのスケーラビリティーを持つと予想される.
問題の大きさにより P4-3.2GHz に比べて性能の差がかなり変わるのは
cache size と問題の関係であることが考えられるが,
明らかにするためにはもっと詳しい調査が必要である.
(Itanium 2 は 9MB の大きな L3 cache を持つことが特徴である.)
前置きが長くなったが 1 thread だけ走らせた場合の性能の比較も同様に図示する.
P4-3.2 GHz を基準にするのは上と同様である.
1 thread の場合についてまとめた通りである.
基本的に dual core では性能は半分になり,HTT では 0.7 倍程度になる.
(半分で無いことに注意.)
つまり CPU 性能のかなりが遊んでいることになる.
以下に 1 thread を走らせた場合の CPU の性能を図示する.
比較の対象として Pentium4-3.2GHz を 1 と規格化したのは先と同じである.
横軸は自由度の数 (同時に解く微分方程式の数) である.
- Dual core も single core も
1 thread では同じ性能になってしまう.
たとえば 4800+ と 4000+ は基本的に同じ性能である.
細かく見ると私のデータでは若干 4800+ の方が速いが,これは chipset
の性能差ということも考えられる.
- 2200+ は大きい問題ではメモリバスの速度が遅い影響が出ているようである.
- 1 thread に特化するのであれば Pentium4 では HTT off にすることにより
1 thread だけ走らせる場合は 10% 程度性能はアップする.
(そのかわり 2 thread 以上走らせる場合は大幅な性能ダウンになる.)
- Itanium 2 はクロックが 1.6GHz なのに P4-3.2 程度の速さを持って
おり,クロックが半分であることを考えればすごい事である.
データのやりとりが 1 回に倍になることを考えれば理論値が叩き出せ
ている事になり, P4-3.2 より概ね 1 割程度速いので素晴らしいとも
いえる (かも知れない). ただこれはあくまでも価格を無視した場合で
あり,価格を考えると数値計算にコストパフォーマンスが良いとはおよ
そ言い難い印象を私は受ける.P4-3.2 より速いのも architecture の
素晴らしさから来るのか単に大きい cache から来るのかも明らかでは
ない.(問題が大きくなると性能が比較的落ちるのことも suggestive
である…)
もちろん,他の用途 (eg. サーバ)のための評価には他の要因も大きいので
(eg. task switching の速さ,etc) 適しているかも知れない.
まとめ
以下に得られた結論とコメントをまとめる.
- 数値計算では 2 つ以上 thread を同時に走らす場合には dual core
は有効であり,理論値通りの single core の 2 倍の性能が得られる.
実質 dual CPU と同じである.今回は Athlon64 X2 について調べたが
PentiumD でも同様な性能アップが見込めると思われる.
- MD 的な数値計算では AMD 64 は P4
に比べてモデルナンバーの割に遅いようである.
通常ショップで簡単に手にはいるこのような用途に最速なのが
Athlon64 FX60 と PentiumD 950 であると考えられる.
今回の結果を単純にスケールすると FX60 の方が 2 割程度速いと予想される.
-
個人的には多少なりとも地球環境への優しさを考慮して現在は
AMD CPU を選択している.
データ
を見る限り PenD は電力消費が概ねフル稼働時 50% 増し,
idle 時に倍である.
ちなみに,数値計算以外の用途には最近はモバイル用 CPU
(AMD Turion64, Intel Pentium-M) を積んだ省電力 PC を
デスクトップの場合にも買っている.
より静かであるという利点もある.(PC の騒音は基本的に排熱により生じる.)
- 現在 gcc の実行コードは Intel compiler の作るものに比べて有意に
遅い.AMD CPU においてでもある.64 bit 実行コードで AMD64 の性能
をフルに発揮したいが,gcc ではそれができず,icc でも当然できない.
(Intel 製 compiler である!)
よって現状では 64 bit computing
の性能を全く引き出せていないと言って良い.
AMD64 に最適化した compiler を AMD が出して
性能をフルに発揮したらどうなるか見てみたいものである.
- 以上はあくまでも自分の試した範囲での結果であり,異なる version
の compiler で異なる最適化 option を使えば結果は異なる可能性があ
る.大きく異なる事があるようであったら指摘してください.
- 今回の調査はあくまでも私の書いた MD の数値計算コードでの性能の
比較である.似たような状況 (CPU intensive, メモリが律速ではない,
浮動小数点計算が主) では,同様な性能の差が見られると考えている.
一方,同じ数値計算でさえも違うタイプの負荷をかけるものでは
異なった結果になると思われる.(たとえばメモリ律速になりがちな
流体計算,ノード間の communication bottleneck のあるパラレル計算
など).さらに,「通常」のアプリケーション(ゲーム,オフィス系,…)
では CPU が律速になる場合がむしろ少なく,他の要因が大きい (HDD
のアクセスの速さ,グラフィックボードの性能,等) 場合が多いので
全く参考にならないと思う.例外的には Photoshop のフィルターの処
理,ビデオ/音楽のエンコーディングのように CPU intensive なタスク
もある.
Home page for Kenichiro AOKI
Last modified: Sat Mar 11 15:25:39 JST 2006