web-dev-qa-db-fra.com

Quand utiliser des balises lors de l'envoi et de la réception de messages dans MPI?

Je ne sais pas quand je dois utiliser des numéros différents pour le champ de la balise dans MPI envoyer, recevoir des appels. J'ai lu this , mais je ne peux pas le comprendre.

Parfois, il peut arriver que A doive envoyer de nombreux types de messages différents à B. Au lieu d'avoir à passer par des mesures supplémentaires pour différencier tous ces messages, MPI permet aux expéditeurs et aux destinataires de spécifier également des ID de message avec le message (appelé balises). Lorsque le processus B ne demande qu'un message avec un certain numéro de balise, les messages avec des balises différentes seront mis en mémoire tampon par le réseau jusqu'à ce que B soit prêt pour eux.

Dois-je utiliser des balises, par exemple, lorsque j'ai plusieurs appels "isend" (avec des balises différentes) du processus A et un seul appel à "ireceive" dans le processus B?

17
FrancescoN

Les balises de message sont facultatives. Vous pouvez utiliser des valeurs entières arbitraires pour eux et utiliser la sémantique que vous aimez et qui vous semble utile.

Comme vous l'avez suggéré, les balises peuvent être utilisées pour différencier les messages de différents types (MPI_INTEGER, MPI_REAL, MPI_BYTE, etc.). Vous pouvez également utiliser des balises pour ajouter des informations sur ce que les données représentent réellement (si vous avez une matrice nx n, un message pour envoyer une ligne de cette matrice sera composé de n valeurs, tout comme un message pour envoyer une colonne de cette matrice; néanmoins, vous souhaiterez peut-être traiter les données de ligne et de colonne différemment).

Notez que l'opération de réception doit correspondre à la balise d'un message qu'elle souhaite recevoir. Cependant, cela ne signifie pas que vous devez spécifier la même balise, vous pouvez également utiliser le caractère générique MPI_ANY_TAG comme balise de message; l'opération de réception correspondra alors à des balises de message arbitraires. Vous pouvez découvrir la balise utilisée par l'expéditeur à l'aide de MPI_Probe.

12
mort

En général, j'ai tendance à les éviter. Il n'est pas obligatoire d'utiliser des balises. Si vous devez obtenir la taille du message avant d'analyser le message, vous pouvez utiliser MPI_Probe. De cette façon, vous pouvez envoyer des messages différents plutôt que de spécifier des balises. J'utilise généralement des balises car MPI_Recv requiert que vous connaissiez la taille du message avant de récupérer les données. Si vous avez des tailles et des types différents, les balises peuvent vous aider à les différencier en ayant plusieurs threads ou processus écoutant sur un sous-ensemble différent. La balise 1 peut signifier des messages de type X et la balise 2 sera des messages de type Y. En outre, elle vous permet d'avoir plusieurs "canaux" de communication sans avoir à faire le travail de création de communicateurs et de groupes uniques.

#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();

}
10
msmith81886

Les balises peuvent être utiles dans les algorithmes calcul distribué où il peut y avoir plusieurs types de messages. Prenons le problème de l'élection des chefs de file, où un processus (candidat à l'élection) envoie un message de type requestVote et les autres processus répondent par un message de type voteGrant.

Il existe de nombreux algorithmes de ce type qui distinguent les types de messages et la balise peut être utile pour classer ces messages.

2