アライドエンジニアリング

技術情報
本ページでは,mpich でのプロセス起動について説明します。
mpich でのプロセス起動 
ワークステーション・クラスタ環境で並列プログラムを実行すると, 各ノード(マシン)上でプロセスが実行されますが, まず疑問に思うのは, 起動時に指定するコマンドラインオプションは引き継がれるの? とか,各プロセスの実行ディレクトリはどこなの? といったことではないでしょうか。 ここでは,mpich でこれらのプロセス起動に関することを 説明します。 対象は Work Station クラスタ型の並列計算環境 ( ch_p4 デバイス ) で,mpich のバージョンは 1.1.2 です。 バージョンが違うと以下の記述と異なる場合がありますので ご注意ください。

●プロセス起動の流れ
例として,ホスト host0 で以下のように mpirun を実行したとしましょう。

host0> mpirun -np 4 -machinefile machines myprog -myopt1 -myopt2

ここで,myprog が並列で実行したいプログラム名で, -np 4 で 4 つのプロセスで実行することを指定しています。 -machinefile で指定している machines は使用するホストを 指定するファイルで,以下のようになっているとします。

host0
host1
host2
host3

これで,host0 から host3 の 4つのホストに対して それぞれ1プロセスずつ合計4つのプロセスにて並列計算を行うことになります。 また,-myopt1 や -myopt2 は myprog に対するオプションです。

この mpirun というプログラムはシェルスクリプトで, 主に以下のようなことを行います。

  • pg ファイルの作成
  • 適切なオプションをつけ,myprog を host0 で起動
pg ファイルというのはどのホストでどのプログラムを 実行するかを記述したファイルで, ユーザが直接記述して指定することも出来ます。 mpirun をディレクトリ/home/foo/work で実行すると, mpirun は myprog に以下のようなオプションをつけて起動します。
  myprog -myopt1 -myopt2 -p4pg /home/foo/work/PI1234 -p4wd /home/foo/work
ここで /home/foo/work/PI1234 は mpirun が作成した pg ファイルで, "1234" の部分は mpirun のプロセス番号となります。 また,-p4wd の後のディレクトリ名は,mpirun を起動したディレクトリ です。

mpirun が起動するプロセスは,この host0 でのひとつだけで, ここではこれをマスタプロセスと呼ぶことにします。 他のリモートホスト上のプロセスは,mpirun ではなく, このマスタプロセスより起動されます。 リモートのプロセスを起動するのは,マスタプロセスの MPI_Init の中で, マスタプロセスが読み込んだ pg ファイルにしたがい (デフォルトでは) rsh を使用して起動されます。 リモートで起動されるプロセス(スレイブプロセスと呼ぶことにします)には,

   myprog host0 2345 -p4amslave
といったオプションがつけられます。 ここで,host0 はマスタプロセスのホスト名,"2345" はマスタプロセス が使うTCP/IPのポート番号で,-p4amslave でこのプロセスがスレイブ であることを示しています。

ここまでの起動プロセスをまとめると,以下のようになります。

[host0] mpirun -np 4 -machinefile machines myprog -myopt1 -myopt2
  |
  +--> [host0] myprog -myopt1 -myopt2 -p4pg /home/foo/work/PI1234 -p4wd /home/foo/work
          |
          +--> [host1] myprog host0 2345 -p4amslave
          |
    (rsh) +--> [host2] myprog host0 2345 -p4amslave
          |
          +--> [host3] myprog host0 2345 -p4amslave

このようにして,各ホスト上で myprog が起動されます。

補足. 上記の例のように各ホスト毎にひとつのプロセスを起動しようとすると,実際には各ホストにもうひとつ別のプロセスが起動されます。 これは MPI_Init 中で fork により起動されるもので,Listener と呼ばれる外部プログラムをさらに 起動するために用いられるもののようです。 ただし,当社が普段使用している Linux のクラスタ環境では,特に何もしていないようで,途中で kill しても問題ないようです。

●コマンドラインオプション
上で見たように,各プロセスの起動時のオプションには元々ユーザが 指定したかった "-myopt1 -myopt2" とは異なったオプションが ついています。マスタプロセスでは "-p4pg ... -p4wd ..." といったものが余分についていますし, スレイブプロセスでは "-myopt1 -myopt2" 自体入っていません。 とすると,コマンドライン・オプションは使えないのかというと, そうではありません。

MPI のプログラムでは,下のようにまずプログラムの冒頭で MPI_Init() を呼ぶことになっています。

#include <mpi.h>

int main(int argc, char *argv[])
{

    MPI_Init(&argc, &argv);

         .
         .
         .
このように,MPI_Init() には,オプションを保持する argv, argc (のポインタ) を引数として渡します。 ここで argc, argv の内容が書き換えられ,元々ユーザが 指定したオプションに再設定されます。 すなわち,起動直後は上で説明したオプションがついていますが, MPI_Init の実行後は, argc = 2, argv[1] = "-myopt1", argv[2] = "-myopt2" となります。 このため,コマンドラインオプションの解析は, MPI_Init() の後に行う必要があります。

●実行ディレクトリ
各プロセスが実行されるディレクトリはどこになるのでしょう? まず起動直後は,マスタプロセスでは mpirun を実行したディレクトリ, rsh で起動されるスレイブプロセスはユーザのホームディレクトリが実行ディレクトリとなっています。この実行ディレクトリも MPI_Init() 中で変更され, 全てのプロセスで -p4wd で指定されたディレクトリ (明示的に指定しなければ mpirun を実行したディレクトリ) に chdir されます。

上で見たようにこの -p4wd オプションがついているのはマスタプロセスに対して だけなわけですが, スレイブプロセスにはマスタプロセスと通信して 作業ディレクトリ名を取得します。 スレイブプロセス起動時にはマスタプロセスのホスト名とポート番号が 指定されていますので,これによりマスタプロセスとの通信を 開始することが可能となっているわけです。

ここで疑問に思われた方もいらっしゃるかも知れませんが, host0 で mpirun を実行したディレクトリが, 他のホスト上にも存在するとは限りません。 このように,-p4wd で指定されたディレクトリが見つからない場合は, 実行プログラム myprog があるディレクトリが実行ディレクトリ となります。 実行するには myprog はどこかに必ずあるわけですので, このディレクトリは必ず存在するはずですね。

●ファイルのオープン
上で述べたように,MPI_Init より前ではカレントディレクトリはホームディレクトリ, 後では,mpirun を起動したディレクトリとなります。 このため,ファイルのオープンは,MPI_Init() の後で行うのが自然です。

問い合わせ
お問い合せは
postmaster@alde.co.jp

までお願いします。



技術情報へ戻る

(C) 2001-2012 Allied Engineering Corporation. All rights reserved.