1. Indice de pagina
  2. 1. Descripción breve
  3. 2. Sintaxis
  4. 2.1. En C
  5. 2.2. En C++
  6. 3. Parámetros
  7. 3.1. De entrada
  8. 3.2. De salida
  9. 4. Descripción
  10. 5. Notas
  11. 6. Errores
  12. 7. Véase también

MPI_Recv

Descripción breve

Rutina de recibimiento de un mensaje desde un proceso.

Sintaxis

En C

#include <mpi.h>
int MPI_Recv(void *buf, int count, MPI_Datatype datatype,
            int source, int tag, MPI_Comm comm, MPI_Status *status)

En C++

#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

Parámetros

De entrada

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.

De salida

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)).

Descripción

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í.

Imagen MPI_recv (Pulsar sobre la imagen para ver la animación)

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.

Notas

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.

Errores

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.

Véase también

MPI_Irecv
MPI_Probe

Creado por: Daniel Guerrero Martínez y Sergio Rodríguez Lumley 2010

Valid HTML 4.01 Transitional