🌊

MPIの基本-MPIでHello World-

2024/04/20に公開

はじめに

MPIのプログラミング方法についての記述が少ないので書いてみることにしました。

MPIとは

MPI(Message Passing Interface)とは、分散メモリ型並列計算機に使用される並列ライブラリの仕様です。仕様ですのでこの仕様に準じたコンパイラをコンパイラ作成者などが作成します。
仕様はここにあります。ターゲットはC/C++/FORTRANです。

https://www.mpi-forum.org/

分散メモリ型並列計算機とは

分散メモリ型並列計算機とはメモリ空間を共有しないでデータをやりとりしながら並列計算を実現する方式の計算機のことを指します。これの対義的なものとして「共有メモリ型並列計算機」があります。
よくある並列計算機は計算機同士をネットワークで接続して協調動作をする「クラスタ計算機」があり、パソコンなどでそれを実現しているもので「PCクラスタ」があります。

MPIの特徴

基本的にはデータの送受信を明示的に関数で埋め込む形です。
この仕様を満たしているコンパイラは多くあり、小さなPCクラスタから大型なクラスタ、代表的なものとして富岳などのスーパーコンピュータでも使えます。

MPIでHello World

では早速並列化してみましょう。
まずは一般的なHello WorldをC言語で書いてみましょう。

hello.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を実装します。

mpi_hello.c
#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