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

时间:2017-08-01 19:14:09

标签: python mpi mpi4py

系统信息:

操作系统:Mac OS X Lion 10.7.5(是的,它已经很老了)

机器:Mac Pro,2010年中期

处理器:2 x 2.66 GHz 6核Intel Xeon

存储:814 GB,总共1000 GB

内存:24 GB RAM

我正在尝试使用mpi4py软件包来并行化一组模拟,但我的安装似乎有问题。为了测试软件包,我将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,运行:

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

非常感谢任何指导。

1 个答案:

答案 0 :(得分:1)

这个例子是为先前版本的mpi4py编写的(我没有通知作者这个)

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

  

commit e6765257b2d4e4d37dd5471b2ab07014ab4d9b02作者:Lisandro   达尔辛日期:2014年5月10日星期六14:17:16 +0300

     

更改所有发送方法的签名

     
      
  • &#39; DEST&#39;是一个必要的论点。
  •   

这里正确的解决方法是替换

comm.Send(integral)

comm.Send(integral, 0)