如何使用mshpcserver2008r2的MPI堆栈成功编译mpi4py?

2024-05-17 03:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

故事是这样的:我需要一个Python的MPI包装器。在

我知道有mpi4py。对于目前的工作,我(主要)使用Python和Windows,我想使用microsoftphcluster包,可以访问一些运行win2008服务器的“强大”机器。我想说的是,除了赢球经验之外,我在MPI和其他方面也有一些经验,但这对于这个问题来说是没有意义的。在

当我遇到Python Tools for Visual Studio时,我对mpi4py的兴趣又恢复了。真是太棒了。任何喜欢visualstudio和Python的人都应该试试。干得好,调试器很棒。在

PTV的文档页说明mpi4py的安装很简单。。。而对于ActiveState Python来说,这似乎是正确的。但是,如果不使用ActiveState的Python,而是使用python.org网站,你好像有点不走运。在

我的开发机器是一台64位和Python2.6的笔记本电脑,有64位和32位版本。 我已经安装了MS HPC Pack 2008 R2 MS MPI和SDK。我有visualstudio2008和2010,所有的东西都经过了尽职的修补。在

没有二进制安装程序,而且知道Unix MPI如何对它们链接的MPI版本非常挑剔,所以我想构建自己的mpi4py。mpi4py基本上依赖于有一个MPI.dll(.pyd实际上)将python调用绑定到MPI-libs。在

轻松安装mpi4py和构建该库失败-无法指向MPI库。好的,没问题,我下载了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开发者。在

在这之后,编译通过了,但我无法链接-有三个未解析的外部对象:

^{pr2}$

似乎是MS MPImsmpi.lib从hpc2008r2没有实现这些,所以我不能构建MPI.pyd公司. 在

我可以尝试在mpi4py C源文件中注释掉这些内容,但我认为这不是正确的路径。在

提前谢谢!在


Tags: ccp版本机器链接dir公司mpi4py经验
2条回答

我和@Hrvoje和当前的源代码维护者在 https://code.google.com/p/mpi4py/

感谢各位的帮助。
我使用了Visual Studio 2012、Python 2.7.3(64位)和MPI4PY 1.3

以下是更改:

  • mpi头和lib现在位于不同的位置(mshpc2008r2),所以我的msmpi部分mpi.cfg公司现在看起来像这样:

    [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构建环境查找的是visualstudio2008,所以我不得不手动添加它要查找的变量。 它实际上指向一个VS2012目录,但是所有的构建工具都是兼容的,所以它可以工作。 这是我加的。在

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

除此之外,没有任何变化设置.py生成了.exe和.msi,没有任何问题。在

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

似乎mpi4pyauthor has also had quite a workload when he worked things out。。。在

If you make the union of missing/broken MPI-2 stuff in MPICH1/LAM/OpenMPI/MPICH2 (and derived implementations like Deino,Microsoft/Sun/SGI), you end-up having to test for a lot of stuff...

由于上述原因,可以在不使用某些函数的情况下编译mpi4py库。 mpi4pytarball中的“missing.h”源文件可以处理这些情况。在

所以我定义了这些:

PyMPI_MISSING_MPI_Type_create_f90_integer
PyMPI_MISSING_MPI_Type_create_f90_real
PyMPI_MISSING_MPI_Type_create_f90_complex

如果调用这些丢失的函数中的任何一个,以这种方式编译的包装器库将引发错误。mpi4py中的.h不见了。 您可以直接在相关文件中添加定义,也可以在设置.cfgmpi4py tarball中的文件:

^{pr2}$

所以,祝你在使用mpi4py和msmpi时好运。。。 希望这对别人有帮助,但我自己。。。在

相关问题 更多 >