如何使用 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 的方法及激活码

如何找到 MS SQL Server 2008 的端口?

如何在 Windows Server 2008 上的 MS Access VBA 中获取 Windows 用户名

Microsoft HPC Pack 2008 SDK 的链接器错误

从 SQL Server 2008 迁移到 MS access 2007

MS SQL Server该如何入门呢