2015-07-13 15 views
13

Non sono sicuro di quando devo utilizzare numeri diversi per il campo tag nell'invio MPI, ricevere chiamate. Ho letto this, ma non riesco a capirlo.Quando utilizzare i tag quando si inviano e si ricevono messaggi in MPI?

A volte ci sono casi in cui una potrebbe essere necessario inviare diversi tipi di messaggi a B. Invece di B dover passare attraverso misure supplementari per differenziare tutti questi messaggi, MPI permette di mittenti e destinatari di specificare anche ID messaggio con il messaggio (noto come tag ). Quando il processo B richiede solo un messaggio con un determinato numero di etichetta , i messaggi con tag diversi verranno bufferati dalla rete finché B è pronto per loro.

Devo utilizzare i tag, ad esempio, quando ho più chiamate "isend" (con tag diversi) dal processo A e solo 1 chiamata a "ireceive" nel processo B?

+1

In questo caso si utilizza 'MPI_TAG_ANY' sul lato di ricezione, esaminare la struttura dello stato dopo la ricezione per determinare quale tag è stato utilizzato ed elaborare di conseguenza. –

risposta

7

I tag di messaggio sono facoltativi. Puoi usare valori interi arbitrari per loro e usare qualunque semantica ti piaccia e ti sembra utile.

Come suggerito, i tag possono essere utilizzati per differenziare i messaggi che consistono di tipi diversi (, MPI_REAL, MPI_BYZE, ecc.). Puoi anche usare i tag per aggiungere alcune informazioni su ciò che i dati rappresentano realmente (se hai una matrice nxn, un messaggio per inviare una riga di questa matrice sarà costituito da n valori, così come un messaggio per inviare una colonna di quella matrice; tuttavia, è possibile trattare i dati di riga e colonna in modo diverso).

Si noti che l'operazione di ricezione deve corrispondere al tag di un messaggio che desidera ricevere. Questo però non significa che devi specificare lo stesso tag, puoi anche usare la wild card MPI_ANY_TAG come tag del messaggio; l'operazione di ricezione corrisponderà a quella dei tag dei messaggi arbitrari. Puoi scoprire quale tag il mittente utilizzato con l'aiuto di MPI_Probe.

7

In generale, tendo a evitarli. Non è richiesto l'utilizzo di tag. Se è necessario ottenere le dimensioni del messaggio prima di analizzare il messaggio, è possibile utilizzare MPI_Probe. In questo modo puoi inviare messaggi diversi anziché specificare i tag. Generalmente utilizzo tag perché lo standard MPI_Recv richiede la conoscenza della dimensione del messaggio prima di recuperare i dati. Se hai dimensioni e tipi diversi, i tag possono aiutarti a distinguere tra di loro avendo più thread o processi in ascolto su un sottoinsieme diverso. Il tag 1 può significare che i messaggi di tipo X e tag 2 saranno messaggi di tipo Y. Inoltre, consente di avere più "canali" di comunicazione senza dover fare il lavoro di creare comunicatori e gruppi unici.

#include <mpi.h> 
#include <iostream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    // Init MPI 
    MPI_Init(&argc, &argv); 

    // Get the rank and size 
    int rank, size; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    // If Master 
    if(rank == 0){ 

     char* message_r1 = "Hello Rank 1"; 
     char* message_r2 = "Hello Rank 2"; 

     // Send a message over tag 0 
     MPI_Send(message_r1, 13, MPI_CHAR, 1, 0, MPI_COMM_WORLD); 

     // Send a message over tag 1 
     MPI_Send(message_r2, 13, MPI_CHAR, 2, 1, MPI_COMM_WORLD); 


    } 
    else{ 

     // Buffer 
     char buffer[256]; 
     MPI_Status status; 

     // Wait for your own message 
     MPI_Recv(buffer, 13, MPI_CHAR, 0, rank-1, MPI_COMM_WORLD, &status); 

     cout << "Rank: " << rank << ", Message: " << buffer << std::endl; 

    } 

    // Finalize MPI 
    MPI_Finalize(); 

} 
+0

quindi se devo inviare più messaggi, in sequenza (1 invio = 1 messaggio), dal processo A al processo B non c'è alcuna necessità di cambiare il tag, è giusto? – FrancescoN

+0

Sì. Hai solo bisogno di tag diversi se prevedi di inviare diversi tipi di messaggi. Altrimenti, 0 è buono. – msmith81886

+0

diversi tipi significano solo MPI_INTEGER e MPI_REAL ad esempio, giusto? – FrancescoN

2

I tag possono essere utili negli algoritmi distribuiti dove possono esserci più tipi di messaggi. Considerare il problema delle elezioni dei leader, in cui un processo (candidato alle elezioni) invia un messaggio di tipo requestVote e gli altri processi rispondono con un messaggio di tipo voteGrant.

Ci sono molti algoritmi di questo tipo che distinguono tra i tipi di messaggi e il tag può essere utile per categorizzare tra tali messaggi.

Problemi correlati