MPIの設定

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

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

設定

まず,Open MPIを各ノードでインストールします.

$ sudo apt install openmpi-bin

次に,hostファイルを作成します.Hostファイルは,クラスタを構成するコンピュータ のアドレスをMPIに教えてあげるためのものです.次の内容のテキストファイルを, /opt/nfs/hostsという名前で作成してください.

sd-nyg01.naist.jp
sd-nyg02.naist.jp
sd-nyg03.naist.jp
sd-nyg04.naist.jp

動作確認

簡単なMPIプログラムを実行し,MPIが正しく動作することを確認します. 以下の操作は全てマスタ上で行います.

下記のソースコードを/opt/nfs/hello.cというファイル名で作成してください. (MPI Tutorialより抜粋)

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);

    // Get the number of processes
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // Get the rank of the process
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    // Get the name of the processor
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    // Print off a hello world message
    printf("Hello world from processor %s, rank %d out of %d processors\n",
           processor_name, world_rank, world_size);

    // Finalize the MPI environment.
    MPI_Finalize();
}

次に,hello.cをMPI用コンパイラでコンパイルし,実行可能ファイルを作成します.

$ cd /opt/nfs
$ mpicc -o hello hello.c

MPIプログラム用ランチャでプログラムを起動します. 下記のようなメッセージが出力されれば成功です.(表示は順不同です)

$ mpirun --hostfile hosts ./hello
Hello world from processor sd-nyg01, rank 2 out of 16 processors
Hello world from processor sd-nyg01, rank 0 out of 16 processors
Hello world from processor sd-nyg01, rank 3 out of 16 processors
Hello world from processor sd-nyg04, rank 14 out of 16 processors
Hello world from processor sd-nyg04, rank 12 out of 16 processors
Hello world from processor sd-nyg03, rank 8 out of 16 processors
Hello world from processor sd-nyg04, rank 15 out of 16 processors
Hello world from processor sd-nyg03, rank 9 out of 16 processors
Hello world from processor sd-nyg02, rank 7 out of 16 processors
Hello world from processor sd-nyg03, rank 10 out of 16 processors
Hello world from processor sd-nyg02, rank 5 out of 16 processors
Hello world from processor sd-nyg04, rank 13 out of 16 processors
Hello world from processor sd-nyg03, rank 11 out of 16 processors
Hello world from processor sd-nyg02, rank 6 out of 16 processors
Hello world from processor sd-nyg01, rank 1 out of 16 processors
Hello world from processor sd-nyg02, rank 4 out of 16 processors