MPI超超入門「Hello world編」

スーパーコンピューターとかで使われる分散メモリ間のメッセージ通信APIの規格であるMPI(MessagePassingInterface)の超超入門。
これを勉強すれば複数のコンピューターを使ってちょうすげぇ計算ができるよ。

ものすごくざっくりした説明をすると

例1.「1〜10までの整数の足し算を二人で行う」
この例では、一人目が1〜5の総和を求め、二人目が6〜10の総和を求め、最後に二人が求めた結果を足せば答えになる。
ここで問題となるのは、「二人が求めた結果を足す」ためには、どちらかの結果をどちらかに伝えなければならない。

例2.「1〜10までの整数について、それぞれの数の一つ前と一つ後の数との和を求める作業を、二人で行う」
分かりにくいので具体的にいうと、「1」については一つ前の数が0で、一つ後の数が2なので、1に対応する答えは0+1+2=3となる。
この例でも、一人目が1〜5について求め、二人目が6〜10について求めるとする。
ここで問題となるのは、一人目が5について答えを求める時、5の一つ後の数である6を、二人目からもらわねばならないことである。
逆に、二人目が6について答えを求める時、6の一つ前の数である5を、一人目からもらわねばならないことである。*1

これらの問題を解決するために用意されるのがMPIであり、C言語にもFORTRANにも実装できる大変嬉し恥ずかしいAPIとなっている。

では記念すべき第一回として、お約束通り「Hello world」をしてみたいと思う。*2

FORTRANプログラムの例

program main
include 'mpif.h'
write(*,*)'Hello MPI'
stop
end

コンパイルと実行の例1(某工業大学スパコンの場合)

mpif90 hello.f -o hello.out -mcmodel=medium ←コンパイラはpgfではなくmpifを使う
mpirun -n 4 hello.out ←実行時オプションとして-nをつける。4の場合は4並列で実行される
Hello world ←4並列で実行したので、結果が4つ出てくる
Hello world
Hello world
Hello world

コンパイルの例2(某帝国大学スパコンの場合)
※某帝国大学インタラクティブでの実行ができないため実行は省略します

mpif90 -Oss -noparallel hello.f -o hello.out


C言語プログラムの例

#include
int main(int argc, char **argv)
{
printf("Hello world \n");
}

コンパイルと実行の例1(某工業大学スパコンの場合)

mpicc hello.c -o hello.exe -mcmodel=medium ←コンパイラgccではなくmpiccを使う
mpirun -n 4 hello.exe
Hello world
Hello world
Hello world
Hello world

コンパイルの例2(某帝国大学スパコンの場合)
※某帝国大学インタラクティブでの実行ができないため実行は省略します

mpicc -Os -noparallel hello.c -o hello.exe

これらの例は、コンパイラをMPIのものに変更したことによって「無理やりMPI化」したものであってプログラム自体は通常のソースコードのままである。
これではあんまり意味がないので、次回は「真にMPI的なHello world」を紹介したいと思う。*3

つづく*4

*1:あくまでたとえ話なので「そんなこともらわなくても分かるじゃん!」というツッコミは却下される

*2:なお、コンパイルオプションや実行時オプションについては環境に依存しますのでお使いのスーパーコンピュータの管理者にお問い合わせください。

*3:ただし今回の記事についても「MPI時のコンパイル方法と実行方法」については意味はある

*4:かどうかは知らん