MPIを使ったプログラムを実行する

Last update: 2024/12/23


環境

MPIのコードを書く

今回はMPIの練習として、参考文献[1]の第2章でFortranで書かれているMPIのコードをベースに以下の内容でコードを作成した。コードの作成にあたって参考文献[2]も参考にした。

#include <mpi.h>
#include <cstdio>

int main(int argc, char **argv) {
        int myid, numprocs;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &myid);
        MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
        printf("Hello MPI! Myid:%d\n", myid);
        if(myid == 0) {
                printf("Process number:%d\n", numprocs);
        }
        int err = MPI_Finalize();
        printf("Finalize result:%d, id:%d\n", err, myid);
}

以下にポイントだけメモしておく。詳細は参考文献[3]を参照のOpenMPIの公式ドキュメントを参照。

プログラムを実行する

上記のコードをhello_mpi.cppという名前で保存し、以下でコンパイルする。

$ mpic++ hello_mpi.cpp

まずは実行ファイルをそのまま実行してみる。

$ ./a.out 

この方法だと並列実行はされないため、以下のように1プロセス分だけの結果が出力される。

Hello MPI! Myid:0
Process number:1
Finalize result:0, id:0

次に、並列実行してみる。mpirunに引数として並列数と実行プログラムを与えて実行することで、並列実行できる。今回は並列数を4にして実行した。

$ mpirun -np 4 ./a.out

以下が実行結果。4並列で実行しているため、4プロセス分の結果が出力されている。コードを見ればわかるように、全体のプロセス数についてはRankが0のプロセスでのみ表示させるようにしている。

Hello MPI! Myid:3
Hello MPI! Myid:2
Hello MPI! Myid:0
Process number:4
Hello MPI! Myid:1
Finalize result:0, id:2
Finalize result:0, id:3
Finalize result:0, id:1
Finalize result:0, id:0

参考文献

[1] 下司雅章 編集/片桐孝洋,中田真秀,渡辺宙志,山本有作,吉井範行,JaewoonJung,杉田有治,石村和也,大石進一,関根晃太,森倉悠介,黒田久泰 著, "計算科学のためのHPC技術1", 2017, 大阪大学出版会

[2]一週間でなれる!スパコンプログラマ

[3]Open MPI v5.0.x — Open MPI 5.0.x documentation


Copyright (c) 2024 kd