2016-10-29 2 views
0

Je suis en train d'exécuter ce code avec mpi4py:MPI collective Réduire et Allreduce avec MPI.MINLOC dans mpi4py ne fonctionne pas

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 

Avec cette commande:

$ mpirun -np 4 python ./reduce_minlock.py 

Mais au lieu de l'attendre résultat Je reçois ce message:

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' 

Je suis arrivé ce code de cette Tutorial. Ce que je ne comprends pas, c'est pourquoi il y a une erreur de type pour réduire quand j'utilise le nombre exact de paramètres. Je me demande si MPI.MINLOC est supporté par mpi4py. Je n'ai trouvé aucun avertissement concernant cette opération dans la documentation. Voici les configurations de mon système:

$ 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) 

Une aide?

Répondre

0

Si vous lisez attentivement les messages d'erreur et que vous essayez de les comprendre, vous risquez d'économiser beaucoup de problèmes potentiels.

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

Ceci est une erreur d'exécution de temps purement Pythonic et n'a rien à voir avec MPI en tant que tel. Il devrait vous inviter à rechercher la bonne signature de MPI.Comm.reduce() d'abord et seulement après avoir vérifié avec elle l'état que le nombre d'arguments est exact. Et en effet, un regard sur Comm.pyx révèle que reduce() ne prend que trois arguments (un requis et deux défaut) en plus de la référence self:

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

Vous fournissez deux arguments comme position et deux sous forme de paires nom-valeur. Le second argument positionnel None et le second nommé fournissent tous les deux des valeurs pour op, donc l'erreur de type. De même, on peut vérifier que allreduce() ne prend que deux arguments et non trois.

La conclusion est que le tutoriel est erroné et probablement basé sur une version antérieure de mpi4py et le nombre d'arguments que vous passer à reduce() et allreduce() est en réalité pas exacte. Vous devez supprimer l'argument None des deux appels.