tag - ¿Cuándo usar etiquetas al enviar y recibir mensajes en MPI?
tag manager app (3)
No estoy seguro de cuándo debo usar números diferentes para el campo de etiqueta en el envío de MPI, recibir llamadas. He leído this , pero no puedo entenderlo.
A veces hay casos en que A podría tener que enviar muchos tipos diferentes de mensajes a B. En lugar de que B tenga que tomar medidas adicionales para diferenciar todos estos mensajes, MPI permite a los remitentes y receptores especificar también las ID de los mensajes con el mensaje (conocidas como etiquetas) ). Cuando el proceso B solo solicita un mensaje con un número de etiqueta determinado, los mensajes con etiquetas diferentes serán almacenados por la red hasta que B esté listo para ellos.
¿Tengo que usar etiquetas, por ejemplo, cuando tengo varias llamadas "isend" (con etiquetas diferentes) del proceso A y solo 1 llamada a "ireceive" en el proceso B?
En general, tiendo a evitarlos. No hay ningún requisito que utilice etiquetas. Si necesita obtener el tamaño del mensaje antes de analizarlo, puede usar MPI_Probe
. De esa manera puedes enviar diferentes mensajes en lugar de especificar etiquetas. Normalmente uso etiquetas porque MPI_Recv
requiere que sepas el tamaño del mensaje antes de obtener los datos. Si tiene diferentes tamaños y tipos, las etiquetas pueden ayudarlo a diferenciarlas teniendo múltiples subprocesos o procesos escuchando sobre un subconjunto diferente. La etiqueta 1 puede significar que los mensajes de tipo X y la etiqueta 2 serán mensajes de tipo Y. Además, le permite tener múltiples "canales" de comunicación sin tener que hacer el trabajo de crear comunicadores y grupos únicos.
#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();
}
Las etiquetas de mensaje son opcionales. Puede usar valores enteros arbitrarios para ellos y usar la semántica que desee y que le parezca útil.
Como sugirió, las etiquetas se pueden usar para diferenciar entre mensajes que constan de diferentes tipos ( MPI_INTEGER
, MPI_REAL
, MPI_BYTE
, etc.). También puede usar etiquetas para agregar alguna información sobre lo que realmente representan los datos (si tiene una matriz n
x n
, un mensaje para enviar una fila de esta matriz constará de n
valores, al igual que un mensaje para enviar una columna de esa matriz). matriz; sin embargo, es posible que desee tratar los datos de filas y columnas de manera diferente).
Tenga en cuenta que la operación de recepción debe coincidir con la etiqueta de un mensaje que desea recibir. Sin embargo, esto no significa que tenga que especificar la misma etiqueta, también puede usar el comodín MPI_ANY_TAG
como etiqueta de mensaje; la operación de recepción coincidirá con etiquetas de mensaje arbitrarias. Puede averiguar qué etiqueta usó el remitente con la ayuda de MPI_Probe
.
Las etiquetas pueden ser útiles en algoritmos de computación distribuida donde puede haber múltiples tipos de mensajes. Considere el problema de la elección del líder, donde un proceso (candidato a elección) envía un mensaje de tipo requestVote y los otros procesos responden con un mensaje de tipo voteGrant.
Hay muchos algoritmos de este tipo que distinguen entre los tipos de mensajes y la etiqueta puede ser útil para categorizar entre dichos mensajes.