Friday, July 23, 2010

[Rocks] MPI通信を行うまで

以下でMPICH2を使った並列計算を行うまでの設定を簡単に箇条書きで整理する。

Last Update: July 23, 2010.

  • Rocks 5.3をマニュアルに従ってインストールする。
    • Frontendノードについてはこちら
      • Frontendノードとインターネットの間にルータを挟んでいる場合、プライベートIPアドレスを設定するとき、他のPCのIPアドレスと競合しない値を入力することに注意。
    • Computeノードについてはこちら
      • Frontendノードにroot権限でログインし、

        # insert-ethers

        と入力、"Choose Appliance Type"から("managed ethernet switch"でない場合)"Compute"と進んで"Inserted Appliances"の画面に進む。
      • このとき、computeノードのPCの電源を入れても認識されず、フリーズした感じで、さらに、computeノードの方では勝手にPXEブートが進むということが生じることがある。この場合、computeノード側で"Ctl+Alt+Del"で再起動をする。そのうち、Frontendの"Inserted Appliances"にMACアドレスなどが表示されるはず。決して、Frontendノードの端末の右上のxをクリックして強制終了してはいけない。後で"# insert-ethers"と入力してもエラーが出る。どう対処するかはよくわからない。
      • computeノードのインストールが終了したら、computeノードのbootの順番を、CD->Hardware->Networkにしておく。
  • mpiexecコマンドを実行するためにアカウントを作成する。
    • ルートでログインし、次のように端末でコマンド入力。
    • # useradd username # passwd username # rocks sync users
      ※ここで、usernameは追加するアカウント名、usernameはそのアカウントでログインするときに必要なパスワード。
    • Computeノードをうまくインストールできていない場合、"ssh compute-0-0"等でアクセスするときにログインパスワードの入力を求められる。さらに、compute-0-0の"/home"にはusernameのディレクトリが存在しない。その場合、こちらを参考に。
  • ステップ2.で作成したアカウントでログインし、mpdのパスを通す。
    • デフォルトではmpdへのパスが設定されていない。ログイン時に毎回設定するのは面倒なので、次の行を".bash_profile"内の"export PATH"よりも前に書き加えておく。
    • PATH=/opt/mpich2/gnu/bin:$PATH
      ※mpcih2が入っているのは"/opt/mpich2"フォルダ。
  • ステップ2.で作成したアカウントのホームディレクトリに".mpd.conf"の名前でファイルを作成し、アカウント所有者だけが読み書きできるようにする。
  • $ cd $HOME $ touch .mpd.conf $ chmod 600 .mpd.conf
    さらに、エディタを使って次の行を書き加える。
    secretword=xxxxxxxxxxx
    ※"xxxxxxxxxxx”は自由に。ただし、ログインのパスワードと同じにならないように。
  • ホームディレクトリにmpdのリングを構成するホスト名をリストアップした"mpd.hosts"を作成。
    • 1行に1ホスト名。例えば、次のように感じ
    • hostname.of.frontend compute-0-0
    • ファイル名はなんでもOK。
  • 各ノードでmpdデーモンを立ち上げる。
  • $ mpdboot -n #daemons -f mpd.hosts
    #daemonsは立ち上げるデーモンの数で、ノードの数より大きくない正の整数。
  • 実行ファイル(execute.out)があるフォルダに各ノードにプロセスを振り分けるためのファイル"mf"を作成し、以下のようにホストを書き加える。
  • hostname.of.frontend:nproc1 compute-0-0:nproc2
    • ここでnproc1はFrontendノードに連続して与えるプロセスの数を表す。同様に、nproc2はComputeノードcompute-0-0に連続して与えるプロセスの数を表す。
    • コロン(:)の前後にスペースはいらない。
    • 詳しくはMPICH2 User's Guid (pp.9-10)を参照。
    • ファイル名は何でもOK。"mf"はmachine fileの頭文字。
  • "mpiexec"を使ってexecute.outを実行する。
  • $ mpiexec -machinefile mf -n #procs ./execute.out
    • ここで、#procsは実行ファイルを走らせるプロセス数。MPIではランクが0から#procs-1まで振り分けられる。
    • #procsはノードの数より小さい必要はない。大きくても、ラウンドロビンで実行。ただし、その場合、メモリの競合問題が大きくなるなどして計算速度が大きく低下する。

Note 1: compute nodeの電源をオフにする方法
root権限でfront endにログインし、
# ssh compute-x-y
(省略)
# poweroff
とすればOK。
※root権限を持たないアカウントからsshを使ってシャットダウンすることはできない。
$ shutdown -h now
としても、コマンドが見つからないというエラーメッセージが表示される。

Note 2: コンパイラにifortを使う方法
 MPICH2のデフォルト・コンパイラはgfortranであるが、mpdbootで立ち上げることのできるデーモンの数が限られてしまう。一方、ifortではそのような弊害は生じない。また、マシン環境がインテルである場合、ifortを使う方が望ましいと考えられる。

 ただし、Rocks Clusterにはifortがデフォルトで入っていないため、自分でインストールする必要がある。
  • インストール方法についてはこちらを参照。
  • ただし、インストールするフォルダは /share/apps 以下にする(理由はこちら)。
  • ifortを使ったコンパイルのしかたはこちらを参照。
Note 3: デーモンを停止させる方法
端末で以下の操作を行なう:
$ mpdallexit

No comments:

Post a Comment