MPIの設定
この節では,Message Passing Interface (MPI) をインストールします. MPIは並列分散計算のためのソフトウェアで,複数のコンピュータ上で並列に実行される プログラムが協調動作することを可能にします.
MPIには様々な実装が存在しますが,今回はオープンソースであり,広く使用されている Open MPIを採用します. SSHとNFSが動作の前提となるので, これらが正しく設定できていることを確認しておいてください.
設定
まず,Open MPIを各ノードでインストールします.
$ sudo apt install openmpi-bin libopenmpi-dev
次に,hostファイルをマスタノードで作成します.Hostファイルは,クラスタを構成するコンピュータ
のアドレスをMPIに教えてあげるためのものです.次の内容のテキストファイルを,
/opt/nfs/hosts
という名前で作成してください.
sd-narakita01.naist.jp
sd-narakita02.naist.jp
sd-narakita03.naist.jp
sd-narakita04.naist.jp
動作確認
簡単なMPIプログラムを実行し,MPIが正しく動作することを確認しましょう. 以下の操作は全てマスタ上で行います.
下記のソースコードを/opt/nfs/hello.c
というファイル名で作成してください.
(MPI Tutorialより抜粋)
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
// MPIを初期化
MPI_Init(NULL, NULL);
// 全プロセス数 (≒クラスタ内のコア数) を取得
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// このプロセスのランク (プロセスID) を取得
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// このノードのホスト名を取得
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Hello worldを出力
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
// MPIを終了
MPI_Finalize();
}
次に,hello.c
をMPI用コンパイラでコンパイルし,実行可能ファイルを作成します.
$ cd /opt/nfs
$ mpicc -o hello hello.c
MPIプログラム用ランチャでプログラムを起動します. 下記のように出力されれば成功です.(表示は順不同です)
$ mpirun --hostfile hosts ./hello
Hello world from processor sd-narakita01, rank 2 out of 16 processors
Hello world from processor sd-narakita01, rank 0 out of 16 processors
Hello world from processor sd-narakita01, rank 3 out of 16 processors
Hello world from processor sd-narakita04, rank 14 out of 16 processors
Hello world from processor sd-narakita04, rank 12 out of 16 processors
Hello world from processor sd-narakita03, rank 8 out of 16 processors
Hello world from processor sd-narakita04, rank 15 out of 16 processors
Hello world from processor sd-narakita03, rank 9 out of 16 processors
Hello world from processor sd-narakita02, rank 7 out of 16 processors
Hello world from processor sd-narakita03, rank 10 out of 16 processors
Hello world from processor sd-narakita02, rank 5 out of 16 processors
Hello world from processor sd-narakita04, rank 13 out of 16 processors
Hello world from processor sd-narakita03, rank 11 out of 16 processors
Hello world from processor sd-narakita02, rank 6 out of 16 processors
Hello world from processor sd-narakita01, rank 1 out of 16 processors
Hello world from processor sd-narakita02, rank 4 out of 16 processors
この出力を見ると,
sd-narakita01
からsd-narakita04
までの4ノード上でプロセスが起動している- ランク0から15までの計16プロセスが起動している
- ランク0から3までの4プロセスが
sd-narakita01
で,ランク1から5がsd-narakita02
で,…という風に,1ノードあたり4プロセスずつ起動している
などがわかります.