CPU の数値計算性能について (2003 年)
はじめに
研究で数値計算を活用することがある.その場合に計算時間をいかに縮小
できるかが重要になる.自分が行うような計算においての CPU の性能を調べ
ることがあるので,それについて以下にいくつか気づいた点を書く.
結局のところ自分の数値計算がどの程度速く走るかが一番の問題である
ので自分のコードでの性能をいろいろ比較してみた.
Pentium, Athlon, Alpha 等の CPU を比較すると,pipeline, cache,
FSB, latency 等の用語が飛び交いがちだが,結局のところ机上の議論ではわからず,
やってみなければわからない.
性能比較の環境について
-
私のコードで計算時間が一番かかるのは MD (=Molecular Dynamics) 的なシミュ
レーションであるのでそれを用いた.
- MD code の一般的傾向とも言えるが,計算は CPU intensive で
memory に対する負荷は比較的軽い.(せいぜい 10MB 程度)
- 自由度の数,実行時間などはいろいろ変えてみて,性能を比較した.
- コードは C で書かれており,single threaded である.
- 全ての場合 OS は GNU/Linux である.(2.2.x, 2.4.x, 2.6.x)
- compiler は Athlon, Athlon64, Pentium 4 の場合は intel 製,
Alpha の場合は DEC 製のを用いた.
- 全ての workstation に最低 1GB RAM を積んでいる.
- Pentium 4 に関しては Hyper Threading Technology (以下 HTT) を有効に
して使った.(HTT については以下参照)
multitasking の下での性能比較
まずいくつか同じ job を同時進行で走らせた場合
の性能を測定し以下に図示した.
(それぞれ ps バージョンにリンクしてある.)
一つ一つの job は自由度 200 程度の production code の典型的 MD 計算である.
図 1: 1〜32 job 同時に同じ計算を走らせた場合の 1 job あたりの cpu 時間.
若干ばらつきがあるが基本的に P4 で 1 job だけの場合以外は CPU
ごとに同じである.
図 2: 1〜32 job 同時に同じ計算を走らせた場合の計算全体に要した実時間.
1 job しか走らせない場合を除いて job 数に比例している.
結果から以下のことが読み取れる:
- 1 job あたりの cpu time は変わらない.(2 job 以上の場合)
- 少なくとも 32 プロセスあたりまでなら単に (cpu time)x(プロセス数)
のように単純に全体の所要時間はスケールする.
- 3,5 のように奇数個のプロセスを同時に走らす場合にも
1 プロセスあたりの cpu time は同じであり,
さらに全体の所要時間もそれぞれ 2 プロセスの場合の
1.5, 2.5 倍である.
奇数個プロセス走らせても OS が自動的に time sharing
してくれるからである.
つまり,GNU/Linux 上の multi-tasking によるオーバーヘッドは認められないと言える.
(1 job の場合については以下で言及)
全ての job の優先度を同じに設定したが,当然,優先度を変えれば
cpu 占有率がそれに応じて変わる.
この結果についても multi-tasking のオーバーヘッド無しで期待される通り
である.
1 job の場合は特殊なので説明する: AMD, Athlon MP の dual では当然2
CPU なので 1 job (single threaded) では CPU が一つ遊んでしまうので 2
job の場合と実時間は同じである.P4-HTT (Pentium 4, Hyper Threading
Technology) も見掛け上は dual CPU であるが実際には 1 CPU しかない見掛
け上の dual である.よって 1 job にしたときは 50% に性能は落ちず,70%
程度になる.HTT は得したように見えるかも知れないが,実際には 1CPU とし
て 100% まで使えればさらに良いと言える.
性能の負荷のかけ方への依存性
私の行っている MD 計算は使う実メモリがせいぜい 10MB 程度の非常に
CPU intensive な負荷である.
MD 計算では自由度の数が問題により変わり,それによりメモリへの
負荷も変わり,性能も若干影響される.
どの程度の影響か自由度の数を 10〜30,000 程度まで変えて調べてみた.
それぞれの workstation の性能をフルに発揮するために全ての場合
2 jobs 同時に走らせた.
図 3:
CPU time の自由度の数への依存性.
比例している場合の直線を参考のために含めた.
ほぼ cputime/job は自由度数に比例していることが見える.
図 4:
P4-3.2GHz を基準 (=1) としたときの物理的 1 CPU あたりの性能.
性能は 1/(CPU 時間) とした.
性能が自由度の数に依存することがわかる.
考察:
- 計算時間は基本的に自由度の数に比例する.
- おおざっぱには上の通りであるがより正確に調べると
同じ CPU でも自由度の数により数割程度の有意な性能差がある.
(誤差は数 % 以内である)
- 自由度の数が増えると alpha, AthlonMP が不利である.
これはメモリ幅が狭いためであると思われる.
これら CPU は若干古いのでしょうがない.
Athlon 64 は single channel であるにも関わらず
大きい問題でも比較的良い性能を保っている.
メモリー幅が FSB800 P4 ほどでないにしろ広いこと,そして
64bit CPU であることが効いてきているのであろうか.
- 自由度の少ない場合は cache が効いてくる.
これは自由度が少ない場合はクロック数がほぼ同じの Athlon 2200+ と
2500+ の性能が同じであり,少し自由度が増えると性能差が出ることから
も見て取れる.
自由度が少ない場合も P4 は比較的性能が高い.
- i875P と 865PE の chipset による差は誤差の範囲内と言えるであろう.
GNU/Linux Workstation の機種による性能比較
上の結果を CPU の種類, architecture ごとにまとめてみた.
P4-3.2GHz HT で複数 job 走らせた場合を基準値 1 とした.
以下にいくつかの CPU の性能を比較してみた.数値計算の性能に興味がある
また,CPU 性能を測定する上で定番のベンチの
SPEC の
CPU2000
の結果を含める.(CFP, CINT ともに base 値を採用)
表 1: CPU 1 個あたりの性能 |
CPU type | chipset | MD での性能 |
CFP2000 |
CINT2000 | Model number 比 |
P4 3.2GHz (HTT on) |
Intel 875P, 865PE | 1 (基準値) |
1270 | 1220 | 1 (基準値) |
Athlon MP 2200+ |
AMD760MPX | 0.62 |
592 | 699 | 0.68 |
Athlon XP 2500+ | VIA KT400 | 0.66 |
| | 0.78 |
Athlon 64 3200+ |
VIA K8T800 |
0.81 | 1100 | 1270 | 1 |
Alpha 21264 833MHz | | 0.72 |
583 | 483 | |
雑感
-
Pentium 4 と Athlon を比べると大体モデルナンバーどおりの性能と思って良いようである.
もともと Athlon は Pentium 4 に比べ FP 性能が低く,
モデルナンバーに比べて若干低めの数字が出ている.
しかし定番ベンチの CFP2000 に比べると高めの数字である.
-
Athlon 同士で比べると 2200+ と 2500+ では性能は 1
割以上上がっているはずであるが実際は数 % しか上がっていない.
表 2: Athlon 仕様比較 |
Model # | Code name | 実クロック |
FSB | L2 Cache |
2200+ | Thoroughbred | 1800 MHz |
133MHz x 2 | 256 KB |
2500+ | Barton | 1833 MHz |
166MHz x 2 | 512 KB |
上の表を見て判るように数値計算で一番効いてくる実クロックが 2% しか違わない.
結果はそれよりは少し cache, FSB の分性能が上がっているという程度である.
もちろん用途によってはモデルナンバー以上の性能アップもありうる.
-
目を引くのが Alpha の浮動小数点演算の性能の高さである.
1998 年頃の CPU にも関わらず最新の高速 CPU に比べてまったく見劣りしない.
当時のエンジニア達のデザインが良かったのではないだろうか?
実際 hardware, software, architecture 全てが重要である.
例えば gcc では DEC 純正コンパイラーの数分の一の性能しか引き出せない.
ただ,その後 Alpha を作った DEC は 1998 年に Compaq に吸収され,
2003 年に Compaq は HP に吸収された.
Alpha は DEC が吸収されるとともに開発は止まった.
関わったエンジニア達もバラバラになったであろう.
寂しい限りである.
- P4 はこのような単純な数値計算には比較的得意なようである.
Pentium 4 Hyper Threading Technology (HTT) の性能
Pentium 4 では GNU/Linux kernel 2.6.0smp を用いた.
HTT off では single CPU と認識されるが,
HTT on では dual CPU として認識される.
HTT on/off は BIOS で設定するため変更には reboot が必要となる.
HTT の効果を検証してみた.(P4-3.2GHz HT で複数 job 走らせた場合を基準値 1 とした.)
表 3: P4 3.2GHz における全体の性能 |
HTT type | 性能 |
HTT on, 複数 jobs | 1 (基準値) |
HTT on, 1 job | 0.7 |
HTT off, 1 job | 0.8 |
HTT の効果が以下のように読み取れる:
- 1 つしか job を走らせない場合は HTT off にした方が 1 割程度速い.
- 2 つ以上走らせる場合は HTT on の場合には全体での性能が 3 割程度上がる.
HTT は万能ではない.私は通常複数個 job を入れることが多いので HTT on
で使っているが, CPU あたり single-threaded job 1つしか走らせない場合は
HTT off の方がむしろ速い.(single threaded=HTT 不対応なアプリケーション
常時一つしか走らせない状況も一般には考えられる.例えばゲームをするなど.)
Athlon64 について
Athlon 64 が出回り出して少したったので買ってみた.スペックは
MSI K8T NEO-FSR (K8T800) に Athlon64 3200+ である.
Linux では 64bit native な OS があり,さらに 32bit のコードも走る
AMD64 には魅力があるのである.上表にある
P4-3.2GHz 両方フルに稼働すると数値計算では 8 割程度の性能である.
しかし,これはともに 2 つ job が走っている状況での話であり,
single thread, 1 job なら HTT on の P4-3.2 より Athlon 64
の方が一割程度速い.(と言っても single thread なら P4 も HTT off にす
れば良くそうすれば同程度).P4 では HTT が効いているとも言える.
おおむね CFP2000 の数値どおりである.
K8T800+Athlon 64 に Linux install はここ近年稀に苦労した:
- TurboLinux 8 for AMD64:
TL8 は Athlon 64, K8T800 に作られていたので
事前に Turbo Linux
web 上の情報で
製品情報,
FAQ
等で問題はなさそうなことを確認.
さらに Turbo linux に電話で問い合わせたところ Athlon64, K8T800
で問題なし,との回答をもらって購入.
CD boot して install. Partition 切ったりしながら install 全てで
(120GB+160GB HDD format 含め) 一時間程度.
いたって順調だと思ったところ,install 後 kernel panic で立ち上がらない.
調べたところ
TL8 用 updatekit
が存在することを発見して install しなおしたところあっさり動いた.
しかし,network に負荷をかけると hang up してしまう.
非常に不安定で使い物にならない.
個人的には以下の点が問題であると思う.
- 最新とは言えすでに出回っている M/B で不安定なのは話にならない.
- update 等の情報が
製品情報
に一切リンクされてなく,Athlon 64 に install
できると書いてあるだけ.非常に misleading である.
- TL8 の install 用 CD1 が install 説明書も含んでいる.
これはまことに頭の悪い設計だ.
正直言って,AMD64 用の Linux やる気あるの? という疑問を禁じ得ない.
事実 ia32 用には 2003 年夏に TL10D を出しているが,
AMD64 用にはいまだに TL10 をリリースしてない.
ia32 用に関してはすでに
updatekit
も出してやる気が感じられることは付け加えておく.
- Mandrake 9.2 for AMD64:
初めは install できそうだが,partition 切るところで何度やっても
format 失敗.ext2, ext3 のどちらでも.
これは workaround があるのかもしれないが,この程度のことで
詰まっているようでは先が思いやられるので避ける.
- Redhat 9.2 for AMD64 (taroon β):
CD が 4 枚というのは煩わしいだがあっさり入って安定している.
やはり Pentium 4 に比べて 64bit Linux 運用に苦労が多すぎる.
その割に性能はたいして高くない.
研究では自分の時間が一番大切なので今の段階では AMD64 機を
メインに使うには私には時期尚早である.
これは AMD のせいではなくシェアの少ないことに起因するのだが,
使う側としてはそうは言ってられない.
個人的には AMD を応援したい気持もあり,実際 P4-3.2 を買うまでの
数台は AMD 機で P4 機は P4-3.2 機だけである.
AMD64 CPU は P4-3.2 に比べて大分安い.
これには AMD の苦労がひしひしと感じられる.
しかし,workstation は CPU だけではないので結局全体では
値段は同じようなものになってしまう.
AMD 64 の native compiler が出てくると数値計算の能力は大きく
変わるのではないだろうか?
例えば alpha は純正 compiler は非常に高性能である.
現状では Intel(!) の ia32 用の compiler を AMD64 用に使っている.
AMD 社がベンチ結果を出すときもそうなのである.
それでも gcc よりは2倍程度速い.
数値計算は AMD64 でしょ!という時期が来ることを期待している.
(2004 年 2 月)
結論
- 1,2 割程度以内でモデルナンバー通りの性能を発揮している.
性能は用途により異なるのでこの程度の誤差はやむをえない.
- 単純な数値計算には Pentium 4 は比較的強いようである.
- Pentium 4 が強いのはあくまでもフルに性能を引き出したとき
(HTT on, multithread) である.
single thread 1 job であれば Athlon 64 の方が速い,
と言っても Pentium 4 の HTT off と同じ程度.
- AMD64 用 Linux distribution は ia32 に比べて未熟である.
早速状況が改善されることを望みたい.
- AMD64 を native compiler での性能を見てみたい.
当然ながら,性能比較は私にとって実用上重要な性能についてのものであり,
一般的なユーザーにとっての性能とは傾向が違う場合が十分考えられる.
さらに,数値計算をする場合でも負荷のかけ方がまったく異なる場合も考えられ,
(例えばメモリ律速になる場合等) その場合はまた性能が少し変わる可能性がある.
机上の議論はいろいろできるが,これについてもやってみなければわからない.
(2004 年 2 月)
Home page for Kenichiro AOKI
Last modified: Mon Apr 5 14:15:55 JST 2004