CentOS6.XのMPIの利用者向けマニュアル

0.はじめに
大学の演習やレポート作成用の端末室にMPIのインストールしたのですが、それの利用者マニュアルを書いたのですが、どこでも似たようなもんだと思いますので、転載しておきます。

環境としては端末室にCentOS6.X/32bitの端末が多数あり、同じ部屋の端末同士はsshでログイン可能な環境です。学生は大学が提供している統合認証のIDでログインします。

今回MPIとしてopenmpiとmpich2を導入しています。

```
$ yum install openmpi openmpi-devel
$ yum install mpich2 mpich2-devel
```

2015/10/16改訂: 端末という単語がCentOSのウインドウを指す場合とパソコン本体を指す場合でごっちゃになっていたので、修正。

マニュアルはここから。

1.はじめに
学科端末室のLinuxで並列プログラミングのライブラリMPI(Message Passing Interface)が利用可能です。本ページでは、端末室でMPIを使うための初期設定と、簡単なプログラムについて述べています。

MPIの詳細については次の文献が役にたちます。

<BLOCKQUOTE>
並列プログラミング<BR>
P.パチェコ著, 秋葉博 訳<BR>
 培風館 , 2001年<BR>
大学図書館にも有ります。
</BLOCKQUOTE>

2.利用するMPIの選択

学科端末にはMPIが2種類導入されています。 openmpiとmpichがインストールされています。基本的な使いかたはどちらも同じです。openmpiとmpichのいずれを使うかを選択してください。

現在インストールされているMPIの表示。

```
$ module avail
------------------------ /usr/share/Modules/modulefiles ------------------------
dot         module-git  module-info modules     null        use.own

------------------------------- /etc/modulefiles -------------------------------
mpich-i386   openmpi-i386   ← この二つが導入されている。
```
利用するMPIの選択。

ウインドウの「端末」を起動し以下のコマンド入力を行ってください。

- openmpiを利用するとき
```
$ echo "module add null" >> ~/.bashrc
$ module initadd openmpi-i386
```

- mpichを利用するとき
```
$ echo "module add null" >> ~/.bashrc
$ module initadd mpich-i386
```

次に、ウインドウを閉じてください。
```
$ exit
```
ウインドウ「端末」を新たに開いてください。そしてコマンド「mpirun -h」を実行ください。

- openmpiを選択したときは以下のような表示になります。

```
$ mpirun -h
(いろいろ表示される)

Report bugs to http://www.open-mpi.org/community/help/
```
最後にopen-mpi云々と表示

- mpichを選択したときは以下のような表示になります。

```
$ mpirun -h
(いろいろ表示される)
http://wiki.mpich.org/mpich/index.php/Using_the_Hydra_Process_Manager
for further details
```
最後にmpich.org云々と表示

以上でMPIの選択は終了です。

3.sshの公開鍵認証の設定

注意: 本設定は、端末室の複数のパソコンでMPIを実行する場合に必要です。1台でのみ実行する場合は不要です。

複数のパソコンでMPIを実行するには、sshを公開鍵認証で利用可能にして下さい．パスワード認証は不可です。

すでにsshを「公開鍵認証」で設定している学生はこの章を読み飛ばして下さい．

今までsshを公開鍵認証を「一度も使った事が無く」，端末室でMPIを利用するためだけにsshを設定するには以下の手順で十分です．(細かい設定は飛ばしてます。)

まずssh用のパスワード(passphrase)を決めて下さい. 統合認証IDとは異なる パスワードがベターです．

コマンド(ssh-keygen)で ~/.ssh/id_rsa.pubと ~/.ssh/id_rsa の二つのファイル を生成してください．id_rsa.pubはsshの公開鍵．id_rasはsshの秘密鍵です．

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/統合認証ID/.ssh/id_rsa): (改行)
Enter passphrase (empty for no passphrase): (ssh用のパスワードを設定する)
Enter same passphrase again: (再度入力)
 **色々表示されます．**
Your identification has been saved in /home/統合認証ID/.ssh/id_rsa.
Your public key has been saved in /home/統合認証ID/.ssh/id_rsa.pub.
The key fingerprint is:
9a:70:ae:ac:bb:db:5a:45:99:00:b0:a2:2d:a4:f8:88 統合認証ID@パソコン名
The key's randomart image is:
+--[ RSA 2048]----+
|.....            |
| .   . o         |
|o.    +          |
|*.   .           |
|= . . o S        |
|.+   = o         |
|E . . +          |
|   + .           |
|  **+            |
+-----------------+
```

続いて公開鍵をauthorized_keysにコピーして下さい. authorized_keysはログ イン許可をするsshの公開鍵の一覧表です．

```
$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
```

以上で端末室でsshを公開鍵認証で使うための設定は終了です。

4.プログラムのコンパイル

MPIのプログラムはFortranで記述する事が多いですが、学科端末室ではC 言語でのみ動作を確認しています。

サンプルプログラムとして二つ用意しています。リンク先のファイルは拡張子が.txtになっていますが、.cに変更してコンパイルしてください。

-mpiの通信確認のプログラム(mpi_hello.c ファイル省略.参考文献43ページからの引用です。)
-mpiの台形積分のプログラム(mpi_sample.c 同上61ページ。)

```
$ mpicc mpi_hello.c -o mpi_hello
$ mpicc mpi_sample.c -o mpi_sample
```

上記作業で実行ファイル　mpi_helloと mpi_sampleが生成されます。

5.プログラムの実行(1台でのみ)

MPIのプログラムはmpirunコマンドで実行できます。 引数-nは何個のプロセスで実行するかの指定です。pc-XXの所は 実際はログインしているパソコン名になります。実行ファイルの指定時はファイル名の 前に「./」を付けてください。

```
$ mpirun -n 5 ./mpi_hello
Hello, my process rank is 1 on pc-XX
Hello, my process rank is 2 on pc-XX
Hello, my process rank is 3 on pc-XX
Hello, my process rank is 4 on pc-XX
```

台形積分の実行結果。(qiita引用時補足: 参考文献のプログラムから修正しているので結果が異なります)

```
$ mpirun -n 5 ./mpi_sample
With n = 1024 trapezoids, our estimate
of the itegral from 0.000000 to 2.000000 = 1.416146
```

6.プログラムの実行(2台以上)

注意: MPIのプログラムを複数で実行する場合は、前述の「3. sshの公開鍵認
証の設定」が必要になります。

複数台で実行する場合は、ほかのパソコンにMPIプログラムの投入時にユーザ 認証が必要になります。

6.1.ssh-agentにsshパスワードの登録

先ほど設定したsshの公開鍵認証はssh-agentというプログラムにパスワードを登録する事により、ユーザ認証時にパスワードを聞いてこなくなります。 パスワードをssh-agentに登録しないと実質的にMPIのプログラムは実行でき ないため、ssh-agentにパスワードを登録してください。

ssh-agentにパスワードを登録するために、まず、端末室のパソコンをもう一台起 動させてください。追加で起動させたパソコンをpc-YYとします。

起動後、パソコンpc-YYにsshでログインしてください。

```
$ ssh pc-YY
```

初回実行時のみ: 以下の質問が表示されます。学科端末室のパソコンは全て以下のfingerprintになっているはずです。同じ値だっ た場合はyesと答えてください。(fingerprintが異なる場合はセキュリティ上 の問題が発生していますので、管理者までお知らせください。) 

```
The authenticity of host 'pc-YY (192.0.2.??)' can't be established.
RSA key fingerprint is 1c:f8:82:fb:d7:fb:4d:af:45:eb:46:90:91:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? (上記のfingerprintと同じならyesと答える)
```
(Qiita引用時補足: 上記の記述ですが、ひとつの雛型を複数の端末にコピーしているためにfingerprintがすべて同じになっています．通常の環境では全てのfingerprintは異なります．)

続いて、以下のウインドウ「Unlock private key」が表示されます。(ウインドウが表示されなかった場合は後述6.3節参照)

![mpi-unlock-passwd.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/93732404-de41-c18b-8195-99d7032f8e18.jpeg)

上記のウインドウに先ほどssh-keygen実行時登録したsshの公開鍵認証のパスワードを入力してください。パスワードの登録に成功すると、pc-YYにログインできます。ログインに成功するとpc-YYというパソコン名が表示されます。

```
統合認証ID@pc-YY:~$
```

ログインに成功したらpc-YYからexitしてください。

```
統合認証ID@pc-YY:~$ exit
```

上記でssh-agentへのssh公開鍵認証のパスワードの登録は終了です。パスワードの登録はOSからlogoutするまで有効です。

3台以上でMPIを実行する場合は必要台数のパソコンを起動し, MPIで用いる全ての パソコンにsshで一度ログインを行ってください。fingerprintが正しいかの確認作 業を全てのパソコンで行う必要があります。


6.2.プログラムの実行

続いて本題のプログラムの実行です。複数台でのMPIの実行はmpirunの引数-hostにパソコン名をコンマ「,」で区切っ て渡してください。現在利用者がログインしているパソコンをpc-XX, 追加で立ち上げたパソコンをpc-YYとすると以下の形になります。実行ファイルの指定時はファイル名の前に「./」を付けてください。

```
$ mpirun -n 5 -host pc-XX,pc-YY ./mpi_hello
Hello, my process rank is 1 on pc-XX
Hello, my process rank is 2 on pc-YY
Hello, my process rank is 3 on pc-XX
Hello, my process rank is 4 on pc-YY
```

台形積分の実行結果。

```
$ mpirun -n 5 -host pc-XX,pc-YY ./mpi_sample
With n = 1024 trapezoids, our estimate
of the itegral from 0.000000 to 2.000000 = 1.416146
```

簡単ですが以上でMPIの初期設定および実行方法の解説を終わります。

6.3.sshトラブルシューティング

もしウインドウ「Unlock private key」が表示されなかった場合.

症状1: 以下の状態(passwd:という表示)になった場合はsshの公開鍵認証の設 定に失敗しています。Ctrl+Cで抜けて設定を見直してください。

```
$ ssh pc-YY
統合認証ID@pc-YY's password:
```

症状2: 以下の状態(Enter passphrase..)になった場合は、GUIでssh公開鍵認証の パスワードが登録できない状態になっています。Ctrl+Cで抜けてください。

```
$ ssh pc-YY
Enter passphrase for key '/home/統合認証ID/.ssh/id_rsa':
```

ssh-agentを以下の手順で実行してください。引用符はバッククオート「`」です。 クオート「'」でありません。

```
$ eval `ssh-agent`
Agent pid XXXX
```

ssh-addでssh公開鍵認証のパスワードの登録。

```
$ ssh-add
Enter passphrase for /home/統合認証ID/.ssh/id_rsa: (sshパスワード入力)
Identity added: /home/統合認証ID/.ssh/id_rsa (/home/統合認証ID/.ssh/id_rsa)
Identity added: /home/統合認証ID/.ssh/identity (統合認証ID@パソコン名)
```

上記でssh-agentへのパスワードの登録が完了です。先ほど述べたGUIでのssh公開鍵認証のパスワード登録はOSからlogoutするま で有効でしたが、ssh-agent＆ssh-addで登録した場合は、ウインドウ「端末」(正確にはログインshell)ごとに必要です。 新しいウインドウ「端末」を開いた場合は再度同じ作業を行ってください。