mpi4py Send() 抱怨参数数量错误

mpi4py Send() complaining about wrong number of arguments

系统信息:

OS: Mac OS X Lion 10.7.5(是的,很老)

Machine:Mac 专业版,2010 年中期

处理器:2 个 2.66 GHz 6 核英特尔至强

存储空间:总共 1000 GB 中的 814 GB 免费空间

内存:24 GB RAM

我正在尝试使用 mpi4py 包来并行化一组模拟,但我的安装似乎有问题。为了测试这个包,我 copy/pasted 将来自 mpi4py 文档站点的脚本放到它自己的文件中,并 运行 它按照文档中的说明进行:

mpiexec -n 4 python trapParallel_1.py 0.0 1.0 10000

(脚本和文档在这里:http://materials.jeremybejarano.com/MPIwithPython/pointToPoint.html#parallelizing-the-trapezoidal-rule;我复制的脚本是 trapParallel_1.py)。

但是,当我 运行 脚本时,我收到以下错误消息:

Traceback (most recent call last):
  File "trapParallel_1.py", line 59, in <module>
    comm.Send(integral)
  File "MPI/Comm.pyx", line 264, in mpi4py.MPI.Comm.Send (src/mpi4py.MPI.c:92839)
TypeError: Send() takes at least 2 positional arguments (1 given)
Traceback (most recent call last):
  File "trapParallel_1.py", line 59, in <module>
Traceback (most recent call last):
  File "trapParallel_1.py", line 59, in <module>
    comm.Send(integral)
    comm.Send(integral)
  File "MPI/Comm.pyx", line 264, in mpi4py.MPI.Comm.Send (src/mpi4py.MPI.c:92839)
  File "MPI/Comm.pyx", line 264, in mpi4py.MPI.Comm.Send (src/mpi4py.MPI.c:92839)
TypeError: Send() takes at least 2 positional arguments (1 given)
TypeError: Send() takes at least 2 positional arguments (1 given)

我没有对代码进行任何编辑——我直接从文档中获取它。我还检查了 mpi4py api 参考,其中指出 Send() 采用一个位置参数。假设代码是正确的,我相信问题出在我安装的 mpi4py 或 mpi 上,但无法弄清楚问题是什么。我用 pip 安装了 mpi4py:

pip install mpi4py

为了安装 mpi,我首先从这里安装了 mpich 3.2 版:https://www.mpich.org/downloads/。我下载了一个 tarball 到我的下载文件夹,展开它,然后从源代码构建 mpich,运行ning:

cd ~/Downloads/mpich-3.2
./configure --enable-shared --prefix=/usr/local/mpich2
make
make install

当我第一次收到错误时,我的下一步是尝试安装 OpenMPI,为此我使用了 Homebrew:

brew install open-mpi

这没有解决问题。我尝试重建 mpich 没有效果;然后,当这不起作用时,我从 mpich 的源目录中 运行 make uninstall 并手动删除我能找到的名称中包含 'mpich' 的每个文件或目录。该脚本仍然生成相同的错误。

一般我会怀疑是mpi4py安装的问题。但是,我知道 mpi4py 使用 Cython,我不确定 Cython 是如何工作的(即, Send() 方法可能是 mpi 本身不存在的东西的包装器,在这种情况下,mpi 安装可能是问题所在)。

此外,在我卸载mpich之前,我从mpich源目录运行make testing查看了文件summary.xml,它总结了测试结果。根据文件,除一项测试外,一切都通过了。错误信息如下:

<NAME>gather_big</NAME>
<NP>8</NP>
<WORKDIR>./coll</WORKDIR>
<STATUS>fail</STATUS>
<TESTDIFF>
[mpiexec@ilims-mac-pro] APPLICATION TIMED OUT
[proxy:0:0@ilims-mac-pro] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:885): assert (!closed) failed
[proxy:0:0@ilims-mac-pro] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[proxy:0:0@ilims-mac-pro] main (pm/pmiserv/pmip.c:206): demux engine error waiting for event
[mpiexec@ilims-mac-pro] HYDT_bscu_wait_for_completion (tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[mpiexec@ilims-mac-pro] HYDT_bsci_wait_for_completion (tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[mpiexec@ilims-mac-pro] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:189): launcher returned error waiting for completion
[mpiexec@ilims-mac-pro] main (ui/mpich/mpiexec.c:344): process manager error waiting for completion

任何指导将不胜感激。

此示例是为 mpi4py 的先前版本编写的(我已将此事通知作者)

dest 参数过去是可选的(默认发送到排名 0)但现在是强制性的

commit e6765257b2d4e4d37dd5471b2ab07014ab4d9b02 Author: Lisandro Dalcin Date: Sat May 10 14:17:16 2014 +0300

Change signature of all send methods,

  • 'dest' is a required argument.

此处正确的解决方法是替换

comm.Send(integral)

comm.Send(integral, 0)