MPIの基本-MPIでHello World-
はじめに
MPIのプログラミング方法についての記述が少ないので書いてみることにしました。
MPIとは
MPI(Message Passing Interface)とは、分散メモリ型並列計算機に使用される並列ライブラリの仕様です。仕様ですのでこの仕様に準じたコンパイラをコンパイラ作成者などが作成します。
仕様はここにあります。ターゲットはC/C++/FORTRANです。
分散メモリ型並列計算機とは
分散メモリ型並列計算機とはメモリ空間を共有しないでデータをやりとりしながら並列計算を実現する方式の計算機のことを指します。これの対義的なものとして「共有メモリ型並列計算機」があります。
よくある並列計算機は計算機同士をネットワークで接続して協調動作をする「クラスタ計算機」があり、パソコンなどでそれを実現しているもので「PCクラスタ」があります。
MPIの特徴
基本的にはデータの送受信を明示的に関数で埋め込む形です。
この仕様を満たしているコンパイラは多くあり、小さなPCクラスタから大型なクラスタ、代表的なものとして富岳などのスーパーコンピュータでも使えます。
MPIでHello World
では早速並列化してみましょう。
まずは一般的なHello World
をC言語で書いてみましょう。
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("Hello World!\n");
}
コンパイルして実行します。
$ gcc -o hello hello.c
$ ./hello
Hello World!
これにMPIの関数を組み込んで並列化しましょう。
今はPCのCPUでも複数のコアを持っているので複数のMPIプロセスを立ち上げて実施することができます。
まずは、MPIが解釈できるコンパイラの導入をします。今回はDebianで入れることのできたMPICHを例に挙げます。
$ sudo apt install mpich
そして、MPIを導入したHello Worldを実装します。
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
MPI_Init(&argc,&argv);
printf("Hello World!!\n");
MPI_Finalize();
}
ヘッダファイルとMPI_Init()
関数およびMPI_Finalize()
関数に挟まれた領域ではプログラムが並列に動くように設計されています。なおこのふたつの関数は実行するソースコードで一回しか呼ぶことはできず、一回以上呼ばれたときの挙動は保証されていません。
では、これをコンパイルします。コンパイルにはMPICHが持つコンパイルコマンドmpicc
を使います。
$ mpicc -o mpi_hello mpi_hello.c
その後実行しましょう。実行にはMPICHが持つ実行コマンドmpiexec
を使います。今回は5個のMPIプロセスを立ち上げて実行します。
$ mpiexec -np 5 ./mpi_hello
Hello World!!
Hello World!!
Hello World!!
Hello World!!
Hello World!!
おわりに
MPIのプログラムの初歩の初歩の初歩を書いてみました。勿論超序盤なのでこれからもっと詳しいことを書いてみたいと思います。
Discussion