Rutina de recibimiento de un mensaje desde un proceso.
#include <mpi.h> int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
#include <mpi.h> void Comm::Recv(void* buf, int count, const Datatype& datatype, int source, int tag, Status& status) const void Comm::Recv(void* buf, int count, const Datatype& datatype, int source, int tag) const
count | Entero que indica el número máximo de elementos que se espera recibir en el buffer de entrada. |
datatype | Tipo de dato de cada elemento que se va a recibir. Acepta constantes definidas por MPI (Véase el apartado de constantes). Por ejemplo MPI_INT. |
source | Rango del proceso de origen esperado, solo se recogen mensajes cuyo origen sea el especificado. Se acepta el valor MPI_ANY_SOURCE , el cual recoge de cualquier proceso origen. (Véase también MPI_Comm_rank) |
tag | Entero que representa la etiqueta del mensaje. Solo se recogerá un mensaje con la etiqueta especificada. Se acepta el valor MPI_ANY_TAG , que recoge con cualquier etiqueta. El significado de la etiqueta queda en manos del usuario, durante el proceso de envío no es modificado. |
comm | Comunicador utilizado para la comunicación. Solo se recogerán mensajes que han sido enviados por el comunicador seleccionado. |
buf | Buffer de entrada en el que se guarda el contenido del mensaje enviado. Recibe un puntero al comienzo del buffer. |
status | Objeto de tipo MPI_Status, contiene datos relevantes sobre el mensaje (como son el origen (MPI_SOURCE) , la etiqueta (MPI_TAG)y el tamaño (size)). |
Esta función bloquea el proceso hasta que se reciba un mensaje con las características especificadas. El uso de las etiquetas puede resultar confuso, se puede entender como una forma de clasificar los mensajes. En el ámbito del correo postal, podríamos clasificar las cartas como factura, con valor 1, y publicidad, con valor 2. Entonces si vamos a nuestro buzón donde siempre nos llega todo el correo (MPI_COMM_WORLD) y solo queremos recoger facturas de la empresa "Embesa" pero no su publicidad, en la función de recibimiento tendríamos tag a 1 y source con el identificador de la empresa. El resultado sería coger una carta que cumpla con estas características, o bien esperar delante del buzón hasta que nos envíen uno así.
Un breve trozo de código para mostrar su uso es como sigue:
int main(int argc, char *argv[]) { int rank, size, carta; MPI_Status estado; MPI_Init(&argc, &argv); // Inicializamos las hebras MPI_Comm_size(MPI_COMM_WORLD, &size); // Obtenemos el numero total de hebras MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Obtenemos el valor de nuestro identificador MPI_Recv(&carta // Referencia al vector donde se almacenara lo recibido ,1 // numero de elementos máximo a recibir ,MPI_INT // Tipo de dato que recibe ,MPI_ANY_SOURCE // pid del proceso origen de la que se recibe ,MPI_ANY_TAG // etiqueta ,MPI_COMM_WORLD // Comunicador por el que se recibe ,&estado); // estructura informativa del estado . . . MPI_Finalize(); return 0; }
Este recibe un elemento de cualquier mensaje enviado por el comunicador global que contenga tipos de datos MPI_INT que le llegue al proceso y lo guarda en la variable carta.
El argumento count indica el máximo número de elementos que se recibirán, para conocer el tamaño verdadero, se puede utilizar MPI_Get_count.
MPI_SUCCESS | No ha habido error, la función MPI se ha realizado satisfactoriamente. |
MPI_ERR_COMM | El comunicador seleccionado no es válido. Un error común es usar un comunicador nulo. |
MPI_ERR_COUNT | Valor de count no válido. El argumento count debe ser un valor no negativo, es posible utilizar el valor cero. |
MPI_ERR_TYPE | Argumento datatype no válido. Puede ocurrir cuando no se hace commit del tipo de dato (Véase MPI_Type_commit). |
MPI_ERR_TAG | Error de tag (etiqueta) no válido. La etiqueta debe tener un valor no negativo. Se permite utilizar en el recibimiento la etiqueta MPI_ANY_TAG. |
MPI_ERR_RANK | Rango (rank) de origen o de destino no válido. El valor debe estar comprendido entre cero y el número de procesos del comunicador menos uno. El rango en una funcion de recibir (como MPI_Recv) puede tomar el valor de MPI_ANY_SOURCE. |