故事就这样了:我需要一个用于Python的MPI包装器。
我知道这里有mpi4py。对于当前的工作,我(主要)使用Python和Windows,我想使用Microsoft HPC群集包,可以访问一些运行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
Run Code Online (Sandbox Code Playgroud)
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 ...
Run Code Online (Sandbox Code Playgroud)
似乎HPC 2008 R2中的MS MPI msmpi.lib无法实现这些功能,因此无法构建MPI.pyd。
我可以尝试在mpi4py C源文件中将它们注释掉,但是我认为这不是正确的路径。
提前致谢!
我知道回答我自己的问题有点奇怪,但它可能会对某人有所帮助。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
Run Code Online (Sandbox Code Playgroud)
如果调用任何这些缺失的函数,以这种方式编译的包装器库将引发错误。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
Run Code Online (Sandbox Code Playgroud)
所以,祝您使用 mpi4py 和 MS MPI 好运...希望这对其他人有帮助,但我自己...
| 归档时间: |
|
| 查看次数: |
2306 次 |
| 最近记录: |