MPI集体减少和Allreduce使用MPI.MINLOC mpi4py无法正常工作

时间:2016-10-29 12:10:09

标签: python numpy mpi mpi4py

我正在尝试使用mpi4py执行此代码:

from mpi4py import MPI
import numpy

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

inp = numpy.random.rand(size)
senddata = inp[rank]
recvdata=comm.reduce(senddata,None,root=0,op=MPI.MINLOC)
print 'on task',rank,'reduce:    ',senddata,recvdata

recvdata=comm.allreduce(senddata,None,op=MPI.MINLOC)
print 'on task',rank,'allreduce: ',senddata,recvdata

使用此命令:

$ mpirun -np 4 python ./reduce_minlock.py

但不是预期的结果,我收到了这条消息:

Traceback (most recent call last):
Traceback (most recent call last):
  File "./reduce_minlock.py", line 11, in <module>
Traceback (most recent call last):
  File "./reduce_minlock.py", line 11, in <module>
    recvdata=comm.reduce(senddata,None,root=0,op=MPI.MINLOC)
  File "MPI/Comm.pyx", line 1298, in mpi4py.MPI.Comm.reduce (src/mpi4py.MPI.c:109386)
TypeError: reduce() got multiple values for keyword argument 'op'
    recvdata=comm.reduce(senddata,None,root=0,op=MPI.MINLOC)
  File "MPI/Comm.pyx", line 1298, in mpi4py.MPI.Comm.reduce (src/mpi4py.MPI.c:109386)
TypeError: reduce() got multiple values for keyword argument 'op'
Traceback (most recent call last):
  File "./reduce_minlock.py", line 11, in <module>
    recvdata=comm.reduce(senddata,None,root=0,op=MPI.MINLOC)
  File "MPI/Comm.pyx", line 1298, in mpi4py.MPI.Comm.reduce (src/mpi4py.MPI.c:109386)
TypeError: reduce() got multiple values for keyword argument 'op'
  File "./reduce_minlock.py", line 11, in <module>
    recvdata=comm.reduce(senddata,None,root=0,op=MPI.MINLOC)
  File "MPI/Comm.pyx", line 1298, in mpi4py.MPI.Comm.reduce (src/mpi4py.MPI.c:109386)
TypeError: reduce() got multiple values for keyword argument 'op'

我从这个Tutorial获得了这段代码。我不明白的是,当我使用确切数量的参数时,为什么存在降低类型错误的原因。我想知道mpi4py是否支持MPI.MINLOC。我没有在文档上发现有关此操作的任何警告。这些是我的系统配置:

$ mpirun --version
mpirun (Open MPI) 1.10.3
Report bugs to http://www.open-mpi.org/community/help/
$ python --version
Python 2.7.12
$ cat /etc/fedora-release 
Fedora release 24 (Twenty Four)

任何帮助?

1 个答案:

答案 0 :(得分:0)

更仔细地阅读错误消息并尝试理解它们可以节省很多潜在的麻烦。

TypeError: reduce() got multiple values for keyword argument 'op'
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是纯粹的Pythonic运行时错误,与MPI本身无关。它应该首先提示您查找MPI.Comm.reduce()的正确签名,并且只有在检查后才会说明参数的数量是准确的。实际上,查看Comm.pyx会发现reduce()除了self引用之外只需要三个参数(一个必需,两个默认):

def reduce(self, sendobj, op=SUM, int root=0):

您提供两个参数作为位置,两个作为名称 - 值对。第二个位置参数None和第二个位置参数都提供op的值,因此类型错误。同样,可以检查allreduce()只接受两个参数,而不是三个。

结论是该教程是错误的,并且可能基于早期版本的mpi4py,并且您传递给reduce()allreduce()的参数数量实际上并不准确。您应该从两个调用中删除None参数。