我正在尝试使用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)
任何帮助?
答案 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
参数。