如何在MS HPC Server 2008 R2的MPI环境中成功编译mpi4py?
事情是这样的:我需要一个可以在Python中使用的MPI封装。
我知道有一个叫做 mpi4py 的东西。现在的工作中,我主要使用Python和Windows,我想用微软的HPC集群包,手头有几台运行Windows 2008 Server的比较“强大”的机器。顺便提一下,除了Windows的经验,我对MPI和一些相关的东西也有一点*类Unix的经验,但这对这个问题来说并不重要。
当我发现了 Visual Studio的Python工具 时,我对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基本上依赖于一个MPI的.dll(实际上是.pyd),它将Python的调用与MPI库连接起来。
通过easy_install安装mpi4py和构建这个库都失败了——因为无法指向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,指向Pack的确切安装位置。这个名字“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 ...
看起来MS MPI的msmpi.lib来自HPC 2008 R2并没有实现这些,所以我无法构建MPI.pyd。
我可以尝试在mpi4py的C源文件中注释掉这些,但我觉得这不是正确的做法。
提前谢谢大家!
2 个回答
我知道自己回答自己的问题有点奇怪,但这可能对某些人有帮助。在Linux上也会出现类似的问题,因为并不是所有的MPI实现都包含所有声明的调用。
看起来mpi4py的作者在解决这些问题时也遇到了不少麻烦...
如果你把MPICH1、LAM、OpenMPI、MPICH2(以及像Deino、Microsoft/Sun/SGI这样的衍生实现)中缺失或有问题的MPI-2内容合并在一起,你会发现需要测试的东西非常多...
基于以上原因,你可以在没有某些功能的情况下编译mpi4py库。mpi4py的压缩包里有一个"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压缩包的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时好运...希望这对其他人也有帮助,而不仅仅是我自己...
我和@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文件,没有遇到任何问题。