2010-08-26 11 views
1

J'essaie d'envoyer des données (forces) à travers 2 processus, en utilisant MPI_SendRecv. Habituellement, les données seront écrasées dans le tampon reçu, je ne veux pas écraser les données dans le tampon reçu à la place je veux ajouter les données qu'il a reçues.Ajouter des données reçues au tampon de réception existant dans MPI_SendRecv

Je peux faire ce qui suit. Stockez les données de l'étape précédente dans un tableau différent, puis ajoutez-les après la réception. Mais j'ai un nombre énorme de nœuds et je ne veux pas avoir de mémoire allouée pour son stockage à chaque pas de temps. (ou écraser les mêmes)

Ma question est là une manière d'ajouter les données reçues directement au tampon et de les stocker dans la mémoire reçue en utilisant MPI?

Toute aide dans cette direction serait vraiment reconnaissante.

Je suis sûr que les appels de communication collective (MPI Reduce) ne peuvent pas être élaborés ici. Y a-t-il d'autres commandes qui peuvent le faire?

+0

Voulez-vous dire ajouter comme somme, ou ajouter comme append? –

+0

Je pense que la référence à MPI_Reduce indique qu'il fait référence à l'addition numérique plutôt qu'à buffer.push_back. – Jeff

Répondre

1

En résumé: non.

In long: votre suggestion n'a pas vraiment de sens. La machine ne peut effectuer aucune opération sur votre valeur reçue sans la mettre d'abord quelque part dans la mémoire locale. Vous aurez besoin d'un tampon pour recevoir la nouvelle valeur, et d'une somme séparée que vous incrémenterez par le contenu du tampon après chaque réception.

+0

oui, j'ai fait de même, d'abord j'ai stocké les valeurs dans la mémoire à un tableau temporaire, puis faire la communication et ensuite ajouter les valeurs reçues à la mémoire tampon, mais je dois faire indépendamment après chaque commande send/recv chaque directions (3 * 2 pour les directions pos et neg), un peu de code supplémentaire mais c'est pareil ... merci beaucoup pour la réponse. – lsk1985

3

En résumé: non, mais vous devriez pouvoir le faire. In long: Votre suggestion a beaucoup de sens et le Forum MPI considère actuellement de nouvelles fonctionnalités qui permettraient essentiellement ce que vous voulez.

Il est incorrect de suggérer que les données doivent être reçues avant de pouvoir être accumulées. MPI_Accumulate effectue une accumulation à distance de manière unilatérale. Vous voulez MPI_Sendrecv_accumulate plutôt que MPI_Sendrecv_replace. Cela est tout à fait logique et une implémentation peut faire beaucoup mieux en interne que vous le pouvez, car elle peut, par exemple, être mise en mémoire tampon par paquet.

Pour suszterpatt, les tampons internes MPI dans le protocole impatient et dans le protocole de rendez-vous peuvent configurer un pipeline pour minimiser la mise en mémoire tampon.

La mise en œuvre de MPI_Recv_accumulate (pour simplifier, que la partie MPI_Send n'a pas besoin d'être pris en compte) ressemble à ceci:

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, MPI_Op op, int source, int tag, MPI_Comm comm, MPI_Status *status) 
{ 
if (eager) 
    MPI_Reduce_local(_eager_buffer, buf, count, datatype, op); 
else /* rendezvous */ 
{ 
    malloc _buffer 
    while (mycount<count) 
    { 
    receive part of the incoming data into _buffer 
    reduce_local from _buffer into buf 
    } 
}