1

簡単な質問があります。

最近、学校のサーバーを使用してmpiプログラムを実行しようとしましたが、次の「奇妙な」問題が発生しました。

'mpirun'コマンドを実行するには、そのパスを.bashrcのデフォルトパスに配置してから、次のように入力する必要がありました。

mpirun -n 16 ./myprogram

libmpi.so.0と呼ばれる欠落しているライブラリに関するエラーを取得するためだけに

ただし、以下のような完全なmpirunパスを使用してプログラムを実行しようとした場合

/usr/lib64/openmpi/bin/mpirun -n 16 ./myprogram

すべてが良かった。

openmpiのFAQを確認したところ、.bashrcに次の行を入力する必要があるとのことでした。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openmpi/lib

これは実際に私のために物事を修正しましたが、私の質問はまだ未解決のままです:

なぜそれが起こったのですか?

よろしくお願いします。

4

1 に答える 1

1

Open MPIのラッパーコンパイラは、myprogramのコンパイル/リンク時にlibmpi.soが配置されている場所を自動的に-rpathしないため(OMPIラッパーコンパイラで渡されるフラグでは最小限のアプローチを採用しています-不要な場合) 、私たちはそれらをそこに置きません)。

具体的には、Linuxで実行可能ファイルを実行すると、ランタイムリンカーは、その実行可能ファイルに必要なすべてのライブラリを検索します( "ldd myprogram"を実行すると、myprogramに必要なライブラリのリストが表示されます) 。すべてのシステムデフォルトの場所(それ自体はsysadminによって構成可能)を調べます。また、LD_LIBRARY_PATHで指定されたすべてのディレクトリも調べます。LD_LIBRARY_PATHは、事実上、リンカーが共有ライブラリを検索するためにディレクトリのリストを拡張するユーザーごとの方法です。

libmpi.soはシステムのデフォルトの場所にないので、LD_LIBRARY_PATHでそのディレクトリを指定する必要があると思います。

または、myprogramをリンクするときに-rpath句を追加することもできます。例えば:

mpicc myprogram.c -o myprogram -Wl,-rpath /opt/openmpi/lib

これにより、場所/ opt / openmpi / libがmyprogramバイナリ自体に埋め込まれ、リンカはその場所でlibmpi.so(および解決する必要のあるその他のライブラリ)も検索します。例えば:

# Without an rpath clause:
[8:45] svbu-mpi:~/mpi % mpicc hello.c -o hello
[8:45] svbu-mpi:~/mpi % ldd hello
linux-vdso.so.1 =>  (0x00007ffff7ffe000)
libmpi.so.0 => not found
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000)
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff7ddf000)
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff7bd2000)
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000)

libmpi.soエントリの「見つかりません」に注意してください。

LD_LIBRARY_PATHを設定して、次のものを見つけることができます。

[8:45] svbu-mpi:~/mpi % setenv LD_LIBRARY_PATH /home/jsquyres/bogus/lib
[8:45] svbu-mpi:~/mpi % ldd hello
linux-vdso.so.1 =>  (0x00007ffff7ffe000)
libmpi.so.0 => /home/jsquyres/bogus/lib/libmpi.so.0 (0x00007ffff7b06000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000)
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff78e8000)
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff76db000)
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000)

または、-rpath句を使用することもできます(その後、LD_LIBRARY_PATHの設定は無関係になります)。

[8:45] svbu-mpi:~/mpi % mpicc hello.c -o hello -Wl,-rpath /home/jsquyres/bogus/lib
[8:45] svbu-mpi:~/mpi % ldd hello
linux-vdso.so.1 =>  (0x00007ffff7ffe000)
libmpi.so.0 => /home/jsquyres/bogus/lib/libmpi.so.0 (0x00007ffff7b06000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d58c00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003d59c00000)
libnuma.so.1 => /usr/lib64/libnuma.so.1 (0x00007ffff78e8000)
libpci.so.3 => /lib64/libpci.so.3 (0x00007ffff76db000)
librt.so.1 => /lib64/librt.so.1 (0x0000003d5a000000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d5c000000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000003d5a800000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d59400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003d59000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d58800000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003d5b000000)
于 2012-03-30T15:49:55.637 に答える