2016-03-18 5 views
0

J'essaie de transmettre une chaîne de texte contenant des informations sur la progression des processus de travail à root = 0. Je suis en utilisant comm.recv, cependant, je ne peux pas recevoir la liste contenant le texte que j'obtiens l'erreur TypeError: expected a writeable buffer object.Comment puis-je passer une chaîne de texte d'un processus de travail mpi4py à root = 0 pour écrire dans la sortie de texte

Le MWE Je suis en train de mettre en place est ci-dessous:

from mpi4py import MPI 
from mpi4py.MPI import ANY_SOURCE 
import numpy as np 

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


data = [] 
recv_buffer = [] 


for i in range(0,10,1): 
    data = data + ["Logfile for iteration %s on rank %s" %(i,rank)] 

print(rank) 
print(data) 

if rank == 0: 
     output = data[0] 
     for i in range(1, size): 
       comm.recv(recv_buffer,ANY_SOURCE) 
       output += recv_buffer[0] 
else: 
     # all other process send their result 
     comm.send(data) 


if rank == 0: 
    print(output) 

Cela échoue à la ligne comm.recv(recv_buffer,ANY_SOURCE). recv_buffer est pré-spécifié comme recv_buffer = []. Comment puis-je rendre ceci inscriptible?

Répondre

3

Vous n'avez pas besoin de fournir un tampon lorsque vous utilisez l'interface en minuscule. Vous pouvez simplement omettez le paramètre tampon et de prendre la valeur de retour:

if rank == 0: 
    output = data # Note, removed data[0], otherwise it is not a list 
    for i in range(1, size): 
     recv_buffer = comm.recv(source=ANY_SOURCE) 
     output += recv_buffer 

Note, il est beaucoup mieux - et plus facile - d'utiliser ici une opération collective.

import itertools 

# No separate send/recv, just this single line 
output = comm.gather(data, root=0) 
# on rank 0, output will be a list of lists 
if rank == 0: 
    # You can convert it to a flat list 
    # If you iterate over the output, you can omit the list(), just use the chain. 
    output = list(itertools.chain(*output)) 
    print(output) 
+0

J'ai déjà regardé des tableaux 'numpy'. Mais je ne peux pas facilement recevoir du texte dans un tableau numpy. Pourquoi n'est-il pas possible de le faire avec une liste? 'data = []' semble être inscriptible dans mon exemple, donc je ne sais pas pourquoi cela n'est pas accessible en écriture pour 'recv_buffer'. – 218

+0

J'ai mal lu votre question, s'il vous plaît voir ma réponse mise à jour. J'espère que cela aide. – Zulan

+0

@ 218, notez que je suppose que vous voulez une liste de toutes les entrées de journal parmi tous les processus. Y at-il une raison pour que votre code utilise 'data [0]'? De cette façon, vous ne créerez qu'une chaîne contenant toutes les premières entrées de journal parmi les processus. – Zulan