2016-04-07 3 views
0

Si je veux lister l'ID de chaque communicateur d'une variable, comment pourrais-je faire cela? Voici une tentative de démontrer cette idée:mpi4py ajouter la valeur id à la liste pour chaque instance de communicateur

from mpi4py import MPI 
comm = MPI.COMM_WORLD 

obj = "I am an example. My ID is unique to each communicator." 
mpi_id = 'rank %i has id %s'%(comm.rank, str(id(obj))) 
comm.send(mpi_id, tag=11, dtest=comm.rank) 

mpi_id_list = [] 
for i in range(comm.size): 
    mpi_id_list.append(comm.recv(source=i, tag=11)) 

print mpi_id_list 
+1

La question n'est pas claire pour moi. Quel est le but de la structure de données que vous essayez de créer? Comment définissez-vous le contenu de cette * liste *? La liste devrait-elle être la même pour chaque rang? Différent? Seulement sur le maître? De plus, votre exemple de code affiche plus de 'recv's que' send', donc cela ne peut pas fonctionner. – Zulan

+0

Oui, je ne suis pas sûr de savoir comment implémenter une version de travail. La fonction python 'id' révèle l'identifiant associé à un objet. Les objets auront toujours le même identifiant sur le communicateur, mais le numéro d'identification est différent sur chaque communicateur. Je voudrais une liste de l'identifiant associé à un objet pour chaque communicateur. Le code fonctionne jusqu'à l'affectation de 'mpi_id', qui est la forme que je veux avoir pour chaque entrée de liste, – kilojoules

+0

Je pense que vous confondez _MPI rangs/processes_ pour _communicators_. Ces derniers sont les contextes logiques, dans lesquels les communications MPI se produisent, alors que les premières sont les entités communicantes réelles. –

Répondre

1

Dans MPI, chaque comm.send(...,dest=x) doit être compensée par une comm.recv(...) exécutée par le processus de rang x. Tous les messages peuvent être envoyés au processus de rang 0 et le processus 0 doit recevoir tous ces messages. Cette opération est une opération collective appelée réduction.

Le code suivant peut être exécuté sur 4 processus en tapant mpirun -np 4 main.py

from mpi4py import MPI 
comm = MPI.COMM_WORLD 

obj = "I am an example. My ID is unique to each communicator." 
mpi_id = 'rank %i has id %s'%(comm.rank, str(id(obj))) 
comm.send(mpi_id, tag=11, dest=0) 

mpi_id_list = [] 
if comm.rank==0: 
    mpi_id_list = [] 
    for i in range(comm.size): 
     mpi_id_list.append(comm.recv(source=i, tag=11)) 

    print mpi_id_list 

#broadcasting the list 
mpi_id_list = comm.bcast(mpi_id_list, root=0) 

#now, the list is the same on all processes. 
print "rank "+str(comm.rank)+" has list "+str(mpi_id_list) 

Notez que cet exemple utilise l'opération collective comm.bcast() à diffuser la liste de résultats à tous les processus. Voir https://mpi4py.scipy.org/docs/usrman/tutorial.html pour des exemples mpi4py de différentes opérations collectives. Par exemple, vous serez tenté par l'opération comm.allreduce():

list=comm.allreduce([mpi_id]) 
print list