如何使用 MS HPC Server 2008 R2 的 MPI 堆栈成功编译 mpi4py?
Posted
技术标签:
【中文标题】如何使用 MS HPC Server 2008 R2 的 MPI 堆栈成功编译 mpi4py?【英文标题】:How to successfully compile mpi4py using MS HPC Server 2008 R2's MPI stack? 【发布时间】:2011-11-01 09:05:43 【问题描述】:故事是这样的:我需要一个用于 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 源文件中注释掉这些,但我认为这不是正确的路径。
提前致谢!
【问题讨论】:
【参考方案1】:我正在与@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,没有任何问题。
【讨论】:
只是为了添加更多“新鲜”信息:mpi4py 的作者 Lisandro Dalcin 更改了 mpi4py 的一些设置例程。当前版本的 mpi4py(来自存储库)应该可以正常安装,无需更改 mpi.cfg。现在 distutil 例程查找 MS MPI,mpi4py 现在可以构建并与 MS HPC Pack 2008 R2 以及较新的 MS HPC Pack 2012 一起正常工作。【参考方案2】:我知道回答我自己的问题有点奇怪,但它可能对某人有所帮助。 Linux 上也会出现类似的问题,因为并非所有 MPI 实现都实际实现了所有声明的调用。
似乎 mpi4py author has also had quite a workload when he worked things out...
如果你将 MPICH1/LAM/OpenMPI/MPICH2 中缺失/损坏的 MPI-2 内容(以及派生的 Deino、Microsoft/Sun/SGI 等实现),你最终不得不 测试很多东西...
由于上述原因,您可以在没有某些功能的情况下编译 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 时好运... 希望这对我自己以外的其他人有所帮助...
【讨论】:
我从字面上复制粘贴该行到 setup.cfg 但我仍然得到/tmp/pip_build_root/mpi4py/_configtest.c:6: undefined reference to
MPI_Type_create_f90_real', when running with
sudo pip install mpi4py`
如果我使用python setup.py build
运行它,我会得到/home/user/Downloads/mpi4py-1.3.1/_configtest.c:6: undefined reference to
MPI_Type_create_f90_real'`以上是关于如何使用 MS HPC Server 2008 R2 的 MPI 堆栈成功编译 mpi4py?的主要内容,如果未能解决你的问题,请参考以下文章
求激活 Windows Server 2008 R2 HPC Edition 的方法及激活码
如何在 Windows Server 2008 上的 MS Access VBA 中获取 Windows 用户名
Microsoft HPC Pack 2008 SDK 的链接器错误