openmpi を memchecker を on してコンパイルする
Ubuntu 13.10 で memchecker を有効にして openmpi をコンパイルしたときのメモ。
openmpi の memchecker
memchecker を有効にしてコンパイルしないと valgrind を有効に使うことは出来ないようだ (http://stackoverflow.com/questions/11077746/openmpi-with-valgrind-can-i-compile-with-mpi-in-ubuntu-distro)。
memchecker はデフォルトでは off になっていて、有効かどうかを
ompi_info | grep -i memchecker
で確認すると Ubuntu 13.10 のパッケージだと有効になっていない。 openmpi はバージョン 1.3 以降、valgrind はバージョン 3.2 以降を使わなければいけない。
ダウンロード
リポジトリの git ミラーを使う。
git clone https://github.com/open-mpi/ompi-svn-mirror.git
cd ompi-svn-mirror
として
git tag
をみるとバージョン毎にタグがついている。
ここでは、バージョン 1.6.5 をコンパイルする。
git checkout v1.6.5
git clean -d -f
としてバージョン 1.6.5 の状態にする。
コンパイル
apt-get build-dep openmpi
でコンパイルに必要なパッケージをインストールする。 他に
apt-get install flex
が必要だった。
configure スクリプトがないので
./autogen.sh
で作る(もちろん、あらかじめ autoconf などの必要なソフトウェアをインストールしておく)。 出来た configure を実行する。 Ubuntu 13.10 で valgrind をパッケージでインストールしているなら
./configure --prefix=/path/to/openmpi --enable-debug --enable-memchecker --with-valgrind=/usr
とする。/path/to/openmpi 以下にインストールすることになる。
make
make install
使用
openmpi を使ったプログラムで memchecker を使用する。
まず、環境変数を設定してコンパイルする。
export LD_LIBRARY_PATH=/path/to/openmpi/lib:$LD_LIBRARY_PATH
configure.ac で
AX_MPI
と書いてある configure なら、環境変数 MPICC を設定して configure スクリプトを実行する。
MPICC=/path/to/openmpi/bin/mpicc ./configure --enable-debug
コンパイルして mpirun で valgrind を実行する。
/path/to/openmpi/bin/mpirun -np 2 valgrind -v --leak-check=full --show-reachable=yes --log-file=valgrind.%p.log path/to/program_with_mpi [OPTIONS]
これだと、Open MPI のエラーも出力されるので、本来のエラーがわかりにくくなる (MPI_Finalize でメモリをきちんと free しなくてもプログラム自体が終了するから、 特に問題はないということで良いのだろうか)。 これは、Valgrind-suppression ファイルを指定すると回避できる。
/path/to/openmpi/bin/mpirun -np 2 valgrind -v --leak-check=full --show-reachable=yes --log-file=valgrind.%p.log --suppressions=/path/to/openmpi/share/openmpi/openmpi-valgrind.supp path/to/program_with_mpi [OPTIONS]
(注意: 私が試したところ、別に suppress されていないように見えた。効果はよくわからない。)
libtool & glib と使う
libtool で生成されたファイルだと、本体は別のところにあるので普通に実行するとうまくいかない。 glib は環境変数を設定しないと不要なエラーが出てしまう。
G_SLICE=always-malloc G_DEBUG=gc-friendly /path/to/openmpi/bin/mpirun -np 2 libtool --mode=execute valgrind -v --leak-check=full --show-reachable=yes --log-file=valgrind.%p.log path/to/program_with_mpi [OPTIONS]