2.3.1. MPI_Comm_size と MPI_Comm_rank

簡単なプログラムのコンパイルから実行までをやってみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <mpi.h>
#include <iostream>
#include <cstdlib>

/*
 * MPI のプロセス数とrankを表示する
 *
 * 実行方法: mpiexec -n 2 sample1
 */
int main(int argc, char *argv[])
{
    MPI_Init(&argc, &argv);

    int num_procs;
    int my_rank;

    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    std::cout << "Number of processes : " << num_procs << std::endl;
    std::cout << "My rank number : " << my_rank << std::endl;

    MPI_Finalize();
    return EXIT_SUCCESS;
}

Download the source code

MPIでは、同じプログラムを指定したプロセスの数だけ実行してそれらのプロセスの間で通信をしながら処理を進めます。

各プロセスではMPIの中でのプロセスの番号である rank 番号を知ることができ、このrank番号に基づいて 自身が担当する計算データの範囲を決めます。上記のプログラムは、起動されると自身のrank番号と 並列処理の総プロセス数を表示して、処理を終えます。

MPIのプログラムは、コンパイルと実行の方法が一般の簡単なプログラムとは違います。

まず、コンパイルのためには、専用のコンパイラドライバを使います。通常のコンパイラコマンドは使いません。

コンパイラドライバの名前は、MPIの実装によって異なります。パソコンのlinuxで手軽に利用できる openmpi であれば、 mpic++ というコマンドがコンパイラドライバの名前です。 スパコンでは、スパコン上のMPIのコンパイラドライバを使う必要があるので、スパコンを使う人は調べてください。 このチュートリアルでは openmpi のコマンド名を使って例を示します。

openmpiでのコンパイルは、次のようにします。:

$ mpic++ -o mpi_sample1 mpi_sample1.cpp

MPIのプログラムを実行するには、MPIのプログラム起動用のツールに実行したいMPIプログラムのパス名や 並列実行するプロセス数などを指定します。

openmpi での起動の例を示します。:

$ mpiexec -n 4 mpi_sample1
Number of processes : 4
My rank number : 1
Number of processes : 4
My rank number : 3
Number of processes : 4
My rank number : 0
Number of processes : 4
My rank number : 2

ここでは4プロセス起動するように指定しています。それぞれのプロセスは実行順序を特に制御されることなく 並列に動くので実行結果の順番はランダムです。1つの行の途中に別のプロセスからの出力が混ざっても おかしくないのですが、この実行例では問題なく表示されています。

スパコンで実行した場合には、各プロセスで標準出力 (std::cout) に出した内容はプロセスごとの ファイルに記録されるので、このように一箇所にまとまって表示されることはありません。

以上で、MPIプログラムのコンパイルと実行までができました。