【问题标题】:MPI Collective Reduce and Allreduce with MPI.MINLOC in mpi4py not working在 mpi4py 中使用 MPI.MINLOC 的 MPI Collective Reduce 和 Allreduce 不起作用
【发布时间】:2016-10-29 12:10:08
【问题描述】:

我正在尝试使用 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)

有什么帮助吗?

【问题讨论】:

    标签: python numpy mpi mpi4py


    【解决方案1】:

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

    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 参数。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 2013-12-03
      • 2020-09-07
      • 2015-11-08
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多