繁体   English   中英

如何使用MS HPC Server 2008 R2的MPI堆栈成功编译mpi4py?

[英]How to successfully compile mpi4py using MS HPC Server 2008 R2's MPI stack?

故事就这样了:我需要一个用于Python的MPI包装器。

我知道这里有mpi4py 对于当前的工作,我(主要)使用Python和Windows,我想使用Microsoft HPC Cluster Pack,可以访问一些运行Win 2008 Server的“强大”计算机。 值得一提的是,除了Win经验之外,我在MPI和其他方面确实有* nix的经验,但这是解决此问题的有意思的地方。

当我遇到适用于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基本上依赖于具有将python调用绑定到MPI库的MPI .dll(实际上是.pyd)。

轻松安装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,该环境变量指向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 ...

似乎HPC 2008 R2中的MS MPI msmpi.lib无法实现这些功能,因此无法构建MPI.pyd。

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

提前致谢!

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

谢谢大家的帮助。
我使用了Visual Studio 2012,Python 2.7.3(64bit)和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都没有任何问题。

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

似乎mpi4py 作者在解决问题时也承担了很多工作 ...

如果您在MPICH1 / LAM / OpenMPI / MPICH2(以及诸如Deino,Microsoft / Sun / SGI之类的派生实现)中合并了丢失/损坏的MPI-2内容,则最终必须测试很多内容...

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

如果曾经调用任何缺少的函数,则以这种方式编译的包装器lib将引发错误。 来自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好运...希望对您有所帮助,但对于我自己...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM