MPIの設定

この節では,Message Passing Interface (MPI) をインストールします. MPIは並列分散計算のためのソフトウェアで,複数のコンピュータ上で並列に実行される プログラムが協調動作することを可能にします.

MPIには様々な実装が存在しますが,今回はオープンソースであり,広く使用されている Open MPIを採用します. SSHNFSが動作の前提となるので, これらが正しく設定できていることを確認しておいてください.

設定

まず,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プロセスずつ起動している

などがわかります.