alfort's Blog

Linuxエンジニアのメモ

MPI (Message Passing Interface) を勉強してみる

MPI (Message Passing Interface) を勉強してみる

2019/06/23追記: FedoraでのMPIのパッケージのインストールが思ったより厄介だったので、インストール方法について追記

MPIは並列コンピューティングのための規格で、これについて勉強しているのでそのメモ。

ja.wikipedia.org

スーパーコンピュータなどを使うHPC (High Performance Computing)の世界では、自分でアプリケーションを実装するようなユーザの場合、使いこなせなければならないようだ。

理論的なところはひとまず置いておいて、手を動かしながら学んでいくつもり。

また、このブログではOpen MPIを中心に扱っていく予定。

MPIの規格、実装

MPIはあくまで規格でしかなく、実装自体は様々なものがある。

オープンソースな実装でいうと Open MPI、MPICHあたりが有名。

www.open-mpi.org

www.mpich.org

MVAPICHは最新のものがバイナリで配布されており、多少古くなったものになってくるとソースコードが公開されるようになっているらしい。

mvapich.cse.ohio-state.edu

MPIのインストール

ひとまず割愛。

使っているOSに合わせて以下を使い分ければひとまず使えそうな印象。

Fedoraの場合

dnf install openmpi
module load mpi/openmpi-x86_64

Fedoraの場合、インストールしただけではPATHが通っていない。

とりあえず動かしたいだけなら、新しいシェルを呼び出すたびにmoduleを呼ぶ必要がある。

以下なんでこうなっているかの情報。

これは、Fedoraの標準のリポジトリに入っているもう一つのMPI実装、MPICHのためのようである。

MPICHもOpen MPI同様に同じコマンド名で同じ機能を提供する。

Fedoraのパッケージマネージャであるdnf としては両方のパッケージをインストールすることを許すため、何らかの仕組みを使ってMPICHとOpen MPIを明に選択する必要がある。

明に選択するのが、module コマンドの役割で、同じ機能を持つ全く別のパッケージを使い分けることができる。

Ubuntu 等の場合

とりあえずaptなどで以下のコマンドを打っておけば使えるようになりそう。

未検証。

apt install openmpi

macOS の場合

Homebrew と呼ばれる有志のパッケージマネージャをインストールしていれば、以下のコマンドでOpen MPIをインストールできる。

brew install open-mpi

brew.sh

ソースコードからビルドしても良いのだけれども、結構面倒くさい。

MPIプログラムの作成

とりあえず、こんなリポジトリを作った。

github.com

自分でプログラムをコピペするのが面倒な人はどうぞ。

まずは普通のCプログラムを書いてみる。

ファイル名はhello.cにした。

MPI独自のことは何もやっていないけど、とりあえずこれで動くはず。

#include <stdio.h>

int main() {
    printf("Hello, MPI World.\n");
    return 0;
}

MPIプログラムのコンパイル、実行

コンパイル

MPIプログラムのコンパイルをやってみる。 といっても、基本的に以下のようにgccのようなコマンドの代わりにmpiccを使えば良い。

$ mpicc hello.c

普通の環境であればa.outが生成されていると思う。

実行

普通のCプログラムであれば、./a.outを端末で実行するだけで良いのだけれども、MPIプログラムの場合はちょっと異なる。

今時のマルチコアマルチスレッドプロセッサの場合、2プロセスでの実行ぐらいはできると思う。

$ mpiexec -np 2 a.out
Hello, MPI World.
Hello, MPI World.

以上のように、2プロセスで実行したので2回Hello, MPI World.が表示されたと思う。

MPIプログラムの場合、基本的にはmain関数を複数のプロセスで実行して、その結果を出力する。

このままではすべてのプロセスが全く同じ処理を勧めてしまうため、処理内容を変えるために、MPIで規格される独自の関数を使う。