0

C++ ライブラリをラップする Python モジュールがあります。ライブラリは MPI を使用し、mpicxx でコンパイルされます。一部のマシンではすべてがうまく機能しますが、他のマシンでは次のようになります。

ImportError: ./_pyCombBLAS.so: undefined symbol: _ZN3MPI3Win4FreeEv

そのため、MPI ライブラリからの未定義のシンボルがあります。私が知る限り、mpicxx はすべてをリンクする必要がありますが、そうではありません。理由はありますか?

4

3 に答える 3

1

間違ったライブラリがロードされていたことが原因であることがわかりました。ご存知のように、クラスターには複数のバージョンの MPI がインストールされている可能性が高く、同じバージョンが複数のコンパイラーでコンパイルされる場合があります。これらはすべて同じファイル名を持つ可能性があります。私の場合、たとえば MPICH GNU でコンパイルしたにもかかわらず、デフォルトのパスは OpenMPI PGI ライブラリでした。私はこれに気づきませんでした.MPICH GNUでコンパイルすると、MPICH GNUライブラリが実行時に見つかると思っていました.

もちろん、Python は GCC でコンパイルされており、PGI は GCC と完全に互換性のあるバイナリを出力しないため、PGI でコンパイルされた OpenMPI を実際に使用することはできませんでした。

解決策は、コードのコンパイルに使用した MPI ディストリビューションと一致するように LD_LIBRARY 環境変数を設定することです。

于 2011-03-15T20:49:03.853 に答える
0

これは共有ライブラリの問題です。機能するシステムと機能しないシステムの両方で、拡張モジュールに対して ldd を実行してみてください。

ldd _extension.so

これにより、拡張機能が依存するすべてのライブラリが表示されるので、それらが利用可能であることを確認できます。

これを回避する簡単な方法は、依存関係を拡張機能に静的にリンクすることです。

于 2011-03-03T02:51:01.257 に答える
0

シンボルZN3MPI3Win4FreeEvは is と定義されているので、代わりにlibmpi_cxx.soとリンクする必要があります-lmpi_cxx-lmpi

于 2012-06-18T09:06:19.820 に答える