Amazon Linux で Open MPI を動かしてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

動かしてみた & C 芸人の Fujimura です。

今回は 並列計算 でよく使われる Message Passing Interface (MPI) 1 の実装の一つである Open MPI を使った pingpong プログラムを Amazon Linux で動かしてみたいと思います。

AWS 公式ではメニーコア CPU を使った HPCユースケース として紹介されていますが、今回は庶民に優しく t2.micro で動かしてみます。

pingpong プログラムとは 2 つのノード (インスタンス) にそれぞれ起動したプロセスの間で適当なサイズのデータを往復させるという、MPI のチュートリアルでよく使われるもので、実運用ではデータサイズを変動させて、ノード間のスループットを計測したりする用途に使われています。

前準備

pingpong プログラムはデータの通信があるため、今回は 2 台のインスタンスを使うようにします。

以下、インストールとビルドはそれぞれのインスタンスで別個に行います。

また、通信には ssh を使うため、ssh 通信ができる設定にしておきます。

インストール

yum からインストールするだけでインストールできます。

# それぞれのインスタンスで実行
$ sudo yum install openmpi-devel

ビルド

OpenMPI のサイトにあるサンプルをダウンロードして、コンパイルします。コンパイルには mpicc という専用のコンパイラを使用します。

# それぞれのインスタンスで実行
$ wget http://www.open-mpi.org/community/lists/devel/att-0116/mpi-ping.c
$ /usr/lib64/openmpi/bin/mpicc mpi-ping.c -o mpi-ping.exe

mpi-ping.c は簡略化すると以下のような処理をしています。(rank はプロセスの ID みたいなものです。)

if (rank == 0) {
send_to_rank(1)
recv_from_rank(1)
} else if (rank == 1) {
recv_from_rank(0)
send_to_rank(0)
}

実行

実行前にどのインスタンスでプロセスを起動するかを示す hostfile を作成しておきます。

中身は単純なホスト名の列挙です。例えば、ホスト名が ip-xxx-xxx-xxx-xxx と ip-yyy-yyy-yyy-yyy の場合は以下のようになります。

$ cat hostfile
ip-xxx-xxx-xxx
ip-yyy-yyy-yyy

実行には mpiexec というプログラムを使用します。下記の例では -hostfile で実行するホスト群を、-np で起動するプロセス数を指定しています。

# いずれかのインスタンスで実行
$ /usr/lib64/openmpi/bin/mpiexec -hostfile hostfile -np 2 ./mpi-ping.exe -B -r 1 1m
mpi-ping: ping-pong (using blocking send/recv)
nprocs=2, reps=1, min bytes=1048576, max bytes=1048576 inc bytes=0
0 pings 1
0 pinged 1: 1048576 bytes 17869.00 uSec 58.68 MB/s

pingpong プログラムにはオプションでブロッキング通信 (-B) で繰り返し回数は 1 回 (-r 1) で 1M のデータを往復させるように指定しています。この場合、往復にかかった時間とスループットが表示されています。

また、上記の例ではインスタンスの間で実際に通信が発生していましたが、同一インスタンス内では通信は発生しません。(-hostfile を指定しないと、メモリ内で処理が完結するため、スループットは上がります。)

まとめ

一昔前だとそれなりの金額で専用の PC クラスタを組んで、並列プログラムを動かすようなことをしていましたが、AWS のようなクラウドコンピューティングサービスを使用することで低価格に抑えることができるという事例が既にたくさん報告されており、初心者が並列プログラムを書くしきいもかなり下がってきていると思われますので、興味ある方は気軽に試してみてはいかがでしょうか?