2016-05-11 3 views
1

code:Pourquoi Gather() échoue si la racine de chaque processus est elle-même?

#mpiexec -n 2 python3 gather.py 
from mpi4py import MPI 

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

a = 1 
comm.barrier() 
b = comm.gather(a, root=rank) 
print("b:", b, rank) 
comm.barrier() 

sortie doit être:

b: [1, 1], 0

b: [1, 1], 1

Cependant , le programme n'imprime rien et ne se termine pas. Quelle est la raison de cela et comment puis-je obtenir la sortie désirée?

+0

Je pense que le processus _every_ devrait spécifier la même racine (afin qu'ils sachent tous où envoyer les données). À l'heure actuelle, chaque processus se spécifie comme étant la racine, alors ils pensent tous qu'ils sont les receveurs et attendent juste que quelqu'un d'autre leur envoie des données. – mgilson

+0

@mgilson Cela semble logique. Savez-vous comment je peux atteindre le résultat souhaité? Je ne veux pas utiliser AllGather() btw. – SpiderRico

+0

Je pense que cela dépend de ce que le résultat souhaité _is_. Normalement, l'idée est de rassembler toutes les données sur les autres processus à un processus spécifié. Savez-vous sur quel processus vous souhaitez collecter les données? – mgilson

Répondre

1

Toutes les opérations collectives dans MPI doivent être appelées par tous les processus dans le communicateur respectif. Beaucoup de paramètres doivent être identiques sur tous les processus. La sémantique des paramètres sont très bien documentés dans le MPI standard:

Le argumentsroot et comm doivent avoir des valeurs identiques sur tous processus.

Mais là encore, il existe également MPI_Allgather, après quoi toutes les données sont disponibles sur tous les processus, c'est-à-dire qu'il n'y a pas de racine.