2016-10-29 4 views
0

Я пытаюсь выполнить этот код с mpi4py:MPI Collective Сократить и Allreduce с MPI.MINLOC в 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. Я не понимаю, почему существует ошибка типа для уменьшения, когда я использую точное количество параметров. Интересно, поддерживается ли MPI.MINLOC mpi4py. Я не нашел предупреждения об этой операции в документации. Это мои системные конфигурации:

$ 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

Чтение более тщательно в сообщения об ошибках и попытки понять их могут сэкономить много потенциальных проблем.

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 от обоих вызовов.