MPI/GAMMA を使ってみる

2001/6/4 牧野


なんか MPI とかそういう腐った開発環境を使わないといけないような良くない時代になってきたので、いろいろやってみることにした。 MPI みたいなものでプログラムをつくって性能を出すということを考える時、問題になるのは以下の 2 つである。
  1. メッセージパッシングでプログラムを書くのはかったるいし、デバッグも異常に面倒くさい。
  2. 通信のオーバーヘッドが大きい、特に短いメッセージでの性能が異常に悪い実装が多いので、そういうのを使うと通信回数を減らすためにアプリケーションレベルで面倒な書き替えをいっぱいしないといけない。
で、まあ、 (1) はどうしようもないとして、 (2) はなるべくまともな MPI の実装を使えば多少は楽になると期待できる。というわけで、まともな、というよりはとにかく速そうな実装を捜してみつかったのが MPI/GAMMA である。 というわけでこの文章は以下こんな感じ。

なぜ GAMMA

なぜ GAMMA かというわけだが、端的にいって「速そうだったから」である。
MPI の通信速度のグラフとかをみると、100BT で MPICH の約 1/10 のレイテンシで通信できているようである。で、ここまでばかばかしく速い実装というのは捜した限りでは見つからなかった。

もっとも、いっぱいお金を払うつもりならば、 Myrinet を使うという解がありえる。しかし、例えば Pentium 4 でクラスタを組もうという時に、 Myrinet を使うというのは馬鹿げている。現時点(2001/6)では Myrinet カードのほうが P4 の箱 (1CPU) より高いからである。ハブもいれれば 2 倍近い。

もちろん、必要な性能を得る方法が Myrinet しかなければやむを得ないが、これがそうかどうかはなかなか疑問である。例えば、RWCPのページでは、 Myrinet+PM+MPICH でのround-trip レイテンシが 20us となっている。これは素晴らしく速い数字ではあるが、一方 MPI/GAMMA on DE500 でも end-to-end で 15us でるそうである。とすれば、 Myrinet では 10us のところが 15us でいけるわけなので、性能差はそんなに大きくはない。値段は仮に Compaq から買っても DE500 は 2万、 Myrinet は 15万なのであまりに大きな違いがある。さらに 3Com 905 とかでちゃんと動くならもっと安いので、ほとんどただみたいなものである。 なお、スループットとして 100MB/s 程度が欲しいとすれば、 100BT では実現できないし GAMMA は trunking とか難しいことはやってくれないので、 Gigabit Ethernet が使いたくなる。これでまともな性能がでるかどうかはまだチェックできてないので、そのへんは問題。

SCore ではいかんの?

で、せっかく RWCP で気合いをいれてディストリビュートしているし、 Linux Cluster とかいうなら SCOre でも使えばいいのではないかという考え方もある。使わない理由は以下のようなものである。 まあ、一応最初の理由がメインである。つまり、現状の SCore/PM では Linux の標準のデバイスドライバに手を入れないという原則でやってるので、特にレイテンシには限界があるのである。どうせカーネルから SCore 用にするくらいならデバイスドライバも自分で書くなり手をいれるなりすればいいのにと思うが、、、

GAMMA をインストールする

まず、ハードウェアがいる。 PC 2台とネットワークカード (NIC) である。 DE500 で動くというので、 2114x が載ったカードなら動くのかと甘くみていたら大間違いで、今のところテストした範囲では本物の DE500 (AA, BA) でしか動いてないような気がする。これは例によって auto negotiation あたりの問題らしいので、そのへんのソースをちゃんといじればいいのかもしれない。但し、この「動いてない」というのは私の勘違いの可能性もある。 まあ、手に入りやすいのは 3Com 3C905 で、これでも動くと書いてあるのでこちらを買う方が無難であろう。 次にソースをダウンロードして、 docs/installGAMMA.ps を見ながらなんかすればいいわけだが、現在の版 ( gamma-01-02-21.tar.gz を使った) は kernel 2.2.17 「だけ」でしか動かないので違うのを使ってる人は入れ換えないといけない。 私は以下のようにして入れ換えたらしい。ます、 www.kernel.org から source tar archive をとってくる。で、 /usr/src で

  184  cp -p /usr2/makino/data6/PDS/linux-2.2.17.tar.gz .
  197  rm linux
  198  tar xvfz linux-2.2.17.tar.gz
  200  mv linux linux-2.2.17
  201  ln -s linux-2.2.17 linux
  209  cd linux
  211  make menuconfig
  212  make dep
  213  make clean
  214  make install
  215  make modules
  216  make modules_install
さて、ドキュメントを読むと TCP/IP と GAMMA を 1 枚の NIC で通せるようなことが書いてあるような気もするが、あまりまともに動きそうな気がしないので NIC 2 枚入れることにする。ここで問題が発生する。 Linux だと、 tulip ドライバが認識するカードを使っている人が多いと思う。DE500 を GAMMA で使うならこれはこれはわりあい面倒なことになる。 というのは、 tulip がカーネルに入っていると、 DE500 ももちろん認識してしまう。そうすると GAMMA でいじった de4x5 ドライバが使おうとしても既にとられてしまっているので使えないということになるからである。 Intel eepro100+ とか、とにかく tulip ではないドライバをカーネルに入れて認識するカードを TCP/IP に使えばもちろん問題はない。 安いカードで tulip で使えるものは結構あるので、この点からも GAMMA で使うのは 3C905 がよいような気がする(ただし、私はまだ DE500でしかテストしてない)

カーネルを make xconfig なり menuconfig で作り直す時に、DE500 を使うなら tulip も de4x5 も外すこと。 3C905 を使うならそれを外す。 gamma ドライバのほうでなんとかするからである。

で、 gamma を入れる。


   115  19:45   cd /opt/gamma
   120  19:45   tar xvzf gamma-01-02-21.tar.gz
   122  19:46   cd gamma
   126  19:46   configure
   127  19:47   make
   128  19:47   su
で make install して、それからもう一回 kernel を作り直す。 なお、 configure で、 verbose y/n? というのがあるが、少なくとも私がテストした環境では verbose=yes にすると「動かない。」ので注意。

GAMMA をテストする。

とりあえず、 reboot して "GAMMA なんたらかんたら" とブート時にでれば、GAMMA デバイスドライバの認識には成功している。 このあと、いろいろ設定がいる。 まず、 (よくわからないんだが) ifconfig して IP アドレスを与えたり up にしたりしないといけないらしい。 ifconfig -a で eth1 (普通は、、、)を見て、 gamma.conf ファイルを作る。これは、マシン名と ethernet address の対応表である。こんな感じ:
cat /etc/gamma.conf
napa     0x00 0x00 0xF8 0x05 0x87 0x1B  
steinberger 0x00 0x00 0xF8 0x06 0x1D 0xDC 
":" で区切るんでなく 0xXX 形式で書かないといけないのがちょっとうっとおしい。 これは GAMMA を動かす各機械でいる(ここでは上の 2 台)で、これらを専用のハブを通すなりクロスケーブルをつかうなりしてつなぐ。

このファイルがあれば、

ifconfig eth1 192.168.2.202
/usr/local/bin/gammagetconfig
とかで IPアドレス を割り当ててから gammagetconfig を実行すればいいみたい。 IPアドレス はもちろんユニークでないといけない。 DEC DE500 だと、ここまで来て configure で fdx を指定していればハブが(その表示があれば) 100 MB/Full duplex になってるはずである。そうなってないと動く見込みはない。

なお、上はもちろんブートのたびに実行する必要がある。私のは Slackware なので /etc/rc.d/rc.local に書き加えた。 RedHut とかでどうするかは知らん。

テストプログラムとしては、 apps/pingpong にある ping_pong でも使ってみる。


ping_pong 1

PERFORMANCE (microsec, MB/sec) (best < average < worst):

total send time        2.23784 < 2.329 < 2.59871
send throughput        0.384806 < 0.429369 < 0.446859
total delay            20.4288 < 20.641 < 20.785
end-to-end throughput  0.0481116 < 0.0484472 < 0.0489504


VARIANCE:  
send time        0.00767123
end-to-end delay 0.00919892

と、こんなのが出れば万歳!である。出ない時?今一使えないドキュメントを見ながらいろいろやってみる。ちなみに上のでは、 1 バイト送った時のレイテンシが 20 us くらいという結果になっている。

MPI/GAMMA を入れる。

ドキュメントには mpich-1.1.2 ベースと書いてあるので、まずそれをとってきてソースを展開する。 私は以下からとってきた。
ftp://ftp.mcs.anl.gov/pub/mpi/old/mpich-1.1.2.tar.gz
/opt/mpich に入れるとして、こんな感じ
   104  18:48   cd /opt/mpich
   107  18:48   tar xvzf /usr2/makino/data6/PDS/mpich-1.1.2.tar.gz
   111  18:49   tar xvzf /usr2/makino/data6/PDS/MPI-GAMMA/mpi*gz
   112  18:49   cd mpich
   116  18:50   ./configure -cc=gcc -fc=f77 -cflags=-fomit-frame-pointer -optcc=-O3 -noromio -nompe -lib=/usr/lib/libgamma.a -device=gamma
   117  18:50   make
で、 .cshrc なりなんなりで
     setenv MPIROOT /opt/mpich/mpich
     setenv MPIBIN $MPIROOT/bin 
して $MPIBIN をパスに入れればOK。 但し、make の前に README.GAMMA を読んで、「こうすれば速くなる」と書いてあるファイルの入れ替えを実行すること。これをやらないと私のところでは実は動かなかった。

MPI/GAMMA を使う。

これはまあなんということはない。普通の MPICH と同じ。 ちなみに、速度の測定結果はこんな感じ。

これは DE500 でのMPI/GAMMA の転送性能の Compaq MPI, MPICH/p4 (どちらも UP2000 667MHz DU box 内)との比較。共有メモリをちゃんと使った Compaq MPI に比べても 3 倍程度と驚異的に短いレイテンシであるのがわかる。ちなみに GAMMA は P4 1.7GHz と K7 1.2GHz の間の転送だが、あんまり CPU の速度には関係ないらしい。

3C905

3Com 3C905C が入った P4 boxen が来たのでそっちで動かしてみる。eth0 を DEC 2114x にして tulip で動かしていると、3C905C と IRQ がぶつかっていると動かない。まあ、これはスロットを変えるかあるいは根本的には BIOS で IRQ を指定すればいいんだと思われる。

と、それはいいんだが、 DE500 に比べて遅いし、しかもなんか MPI を動かすと不安定で時々こける、、、

GA620T

Netgear GA620T が届いたので DE500 をこっちに取り替える。まずはまったのは、カードを認識しないこと。来たカードはPCI device ID が 630a になってるけど、 acenic.c のソースをみると 620a になっていてこれでは認識するはずがない。

で、これをなにも考えずに 630a に書き直すが、、、やはり認識しない。で、良く見てみるとこれは

/usr/src/linux/include/linux/pci.h
で既に定義されていて、そっちを使っていた。 というわけで、こっちを書き直してしまう。

動くかどうかは不安だが、まあこれでやってみると、、、 ping_pong はOK。と思ったら 1498bytes でこける。さらに、よくみると100で動いていて 1000 になってない、、、 1000 にならないのはケーブルが悪いかもしれないので、これはもうちょっと調べる。 1498 は、 USE_JUMBO_FLAMES をはずしたら一応直ったけど、、、

100 で動いてるせいかもしれないけど、いまのところレイテンシは非常に大きい。

2001/6/7 ちょっと改訂。

2001/6/7 3COM905, GA620T の項を追加。