MPI (Message Passing Interface) を勉強してみる
2019/06/23追記: FedoraでのMPIのパッケージのインストールが思ったより厄介だったので、インストール方法について追記
MPIは並列コンピューティングのための規格で、これについて勉強しているのでそのメモ。
スーパーコンピュータなどを使うHPC (High Performance Computing)の世界では、自分でアプリケーションを実装するようなユーザの場合、使いこなせなければならないようだ。
理論的なところはひとまず置いておいて、手を動かしながら学んでいくつもり。
また、このブログではOpen MPIを中心に扱っていく予定。
MPIの規格、実装
MPIはあくまで規格でしかなく、実装自体は様々なものがある。
オープンソースな実装でいうと Open MPI、MPICHあたりが有名。
MVAPICHは最新のものがバイナリで配布されており、多少古くなったものになってくるとソースコードが公開されるようになっているらしい。
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
ソースコードからビルドしても良いのだけれども、結構面倒くさい。
MPIプログラムの作成
とりあえず、こんなリポジトリを作った。
自分でプログラムをコピペするのが面倒な人はどうぞ。
まずは普通の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で規格される独自の関数を使う。