5

所以故事是这样的:我需要一个用于 Python 的 MPI 包装器。

我知道有mpi4py。对于目前我(主要)使用 Python 和 Windows 的工作,我想使用 Microsoft HPC Cluster Pack,可以访问一些运行 Win 2008 Server 的非常“强大”的机器。顺便提一下,除了 Win-experience,我在 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 库。好的,没问题,我下载了 mpi4py 压缩包,解压缩并更改了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 开发人员。

在此之后,编译通过正常,但我无法链接 - 有三个未解决的外部:

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

我知道回答我自己的问题有点奇怪,但它可能会对某人有所帮助。Linux 上也会出现类似的问题,因为并非所有 MPI 实现都实际实现了所有声明的调用。

看来mpi4py的作者在搞事情的时候也有不小的工作量……

如果您在 MPICH1/LAM/OpenMPI/MPICH2(以及 Deino、Microsoft/Sun/SGI 等派生实现)中合并丢失/损坏的 MPI-2 内容,您最终将不得不测试很多内容......

由于上述原因,您可以在不使用某些功能的情况下编译 mpi4py 库。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

如果调用了这些缺失函数中的任何一个,以这种方式编译的包装器库将引发错误。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 回答