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]

参考

Tags of current page