動機

bashスクリプトをmpi並列で実行したかったのだが、bashスクリプト内でrankを取得する必要が出てきた。以下のような感じ。

$ mpirun -np 24 ./my-script.bash

my-script.bash

#!/bin/bash
mpi_comm_rank rank

echo "my rank id is "$rank

bashスクリプト内でmpi_comm_rankなどの関数を呼び出してrankを取得することはできるのか?

MPI-Bash

githubで公開されている、bash内でmpiの関数が呼び出せるように改良されたもの。(URL https://github.com/losalamos/MPI-Bash)

Intel-MPIだとうまくいくが、MPTだとどうも実行時にセグる。mpicc 16.0.1.150 で intel-mpi 5.1.2.150 では一応うまくいく。

ビルドの手順はgithubのページにある。

使用例

まさに動機で示したとおりのようなことができる。

sample.bash

#! /usr/bin/env mpibash
enable -f mpibash.so mpi_init
mpi_init

mpi_comm_rank rank
echo "my rank id is "$rank
mpi_barrier

のようなスクリプトを書いて

$ mpirun -np 24 ./sample.bash

で各プロセスのrankの取得ができる。
他にも、以下の関数が利用可能。
- mpi_abort
- mpi_allreduce
- mpi_barrier
- mpi_bcast
- mpi_comm_size
- mpi_exscan
- mpi_recv
- mpi_finalize
- mpi_scan
- mpi_send

まとめ

MPI-Bashを使ってみた。mpiで実装されている関数が幾つか利用可能なので、かなり細かい処理をbashスクリプトを介して行うことができそう。ただ、この記事を書いた後でpythonやrubyのMPIバインディングが存在することを見つけてしまい(mpi4pyruby-mpi)、こっちを使ったほうがよかったかもと思っている。