5

つまり、Python 用の MPI ラッパーが必要です。

mpi4pyがあることは知っています。現在の作業では、Python と Windows を (ほとんど) 使用しています。Microsoft HPC Cluster Pack を使用して、Win 2008 Server を実行するいくつかのかなり「強力な」マシンにアクセスしたいと考えています。Win の経験に加えて、MPI などの *nix の経験が少しありますが、それはこの問題のかなり重要な点です。

Python Tools for Visual Studioに出くわしたとき、mpi4py への関心が新たになりました。それはいくつかの真剣に素晴らしいものです。Visual Studio と Python のファンなら誰でも試してみてください。良い仕事、そして素晴らしいデバッガー。

PTVS のドキュメント ページには、mpi4py のインストールは簡単であると記載されています...そして ActiveState Python の場合、それは本当のようです。ただし、ActiveState の Python を使用せず、代わりに python.org の「通常の」Python ディストリビューションを使用する場合は、少し運が悪いようです。

私の開発マシンは、Win7 64 ビットと Python 2.6 を搭載したラップトップで、64 ビットと 32 ビットの両方のフレーバーがあります。MS HPC Pack 2008 R2 MS MPI および SDK をインストールしました。私は Visual Studio 2008 と 2010 を持っており、すべてに忠実にパッチが適用されています。

バイナリ インストーラーはなく、Unix MPI がリンク先の MPI バージョンに対して非常にうるさいことを知っていたので、独自の mpi4py を構築したいと考えました。mpi4py は基本的に、Python 呼び出しを MPI ライブラリにバインドする MPI .dll (実際には .pyd) に依存しています。

mpi4py の easy_installing とそのライブラリのビルドが失敗しました - MPI ライブラリを指すことができません。OK、問題ありません。mpi4py tarball をダウンロードして展開し、正しいフォルダーを指すようにmpi.cfgファイルを変更しました。

# Microsoft MPI example
# ---------------------
[msmpi]
define_macros = MS_MPI=1
mpi_dir = $CCP_HOME
include_dirs = %(mpi_dir)s\Inc
libraries = msmpi
library_dirs = %(mpi_dir)s\lib\i386

MS MPI インストーラーは、パックの正確なインストール場所を指す環境変数 CCP_HOME を登録します。「CCP」という名前は、Microsoft Compute Cluster Pack と呼ばれていた時代から残っているに違いありません)。これを元の mpi4py 開発者に渡す必要があります。

この後、コンパイルは問題なくパスしますが、リンクできません。未解決の外部が 3 つあります。

MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_integer@8 referenced in ...
MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_real@12 ...
MPI.obj : error LNK2019: unresolved external symbol _MPI_Type_create_f90_complex@12 ...

HPC 2008 R2 の MS MPI msmpi.lib はこれらを実装していないようで、MPI.pyd をビルドできません。

mpi4py C ソース ファイルでこれらをコメント アウトすることもできますが、これは正しいパスではないと思います。

前もって感謝します!

4

2 に答える 2

4

私は @Hrvoje と https://code.google.com/p/mpi4py/でソース コードの現在のメンテナーと話をしていました。

皆さん、ご協力ありがとうございます。
Visual Studio 2012、Python 2.7.3 (64 ビット)、および MPI4PY 1.3 を使用しました。

変更点は次のとおりです。

  • mpi ヘッダーとライブラリは別の場所 (MS HPC 2008 R2) にあるため、mpi.cfg の msmpi 部分は次のようになります。

    [msmpi]
    mpi_dir = $ProgramFiles\Microsoft HPC Pack 2008 R2
    include_dirs = %(mpi_dir)s\inc
    libraries = msmpi
    #library_dirs = %(mpi_dir)s\lib\i386
    library_dirs = %(mpi_dir)s\lib\amd64
    
  • Python ビルド環境は Visual Studio 2008 を探すため、探している変数を手動で追加する必要がありました。実際には VS 2012 ディレクトリを指していますが、すべてのビルド ツールに互換性があるため、機能しました。これは私が追加したものです。

    VS90COMNTOOLS = C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
    

それ以外に変更はなく、setup.py は .exe と .msi の両方を問題なく生成しました。

于 2013-03-07T21:38:13.190 に答える
1

自分の質問に答えるのは少し奇妙ですが、誰かの助けになるかもしれません。すべての MPI 実装が宣言されたすべての呼び出しを実際に実装しているわけではないため、Linux でも同様の問題が発生します。

mpi4py の作成者も、作業にかなりの労力を費やしたようです ...

MPICH1/LAM/OpenMPI/MPICH2 (および Deino、Microsoft/Sun/SGI などの派生実装) で欠落/破損した MPI-2 のものを結合すると、多くのものをテストする必要があります...

上記の理由により、一部の関数を使用せずに mpi4py lib をコンパイルできます。mpi4py tarball の「missing.h」ソース ファイルは、これらの状況を処理します。

だから私はこれらを定義しました:

PyMPI_MISSING_MPI_Type_create_f90_integer
PyMPI_MISSING_MPI_Type_create_f90_real
PyMPI_MISSING_MPI_Type_create_f90_complex

この方法でコンパイルされたラッパー lib は、これらの不足している関数のいずれかが呼び出されると、エラーを発生させます。これを処理するのは mpi4py の missing.h です。これを行うには、関連するファイルに #defines を直接追加するか、mpi4py tarball の setup.cfg ファイルの最後にこれを追加します。

[build_ext]
define = PyMPI_MISSING_MPI_Type_create_f90_integer, PyMPI_MISSING_MPI_Type_create_f90_real, PyMPI_MISSING_MPI_Type_create_f90_complex

だから、mpi4pyとMS MPIを使って頑張ってください...これが私以外の誰かを助けてくれることを願っています...

于 2011-08-23T10:41:20.367 に答える