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. Errores
  11. 6. Véase también

MPI_Irecv

Descripción breve

Operación de recibo de mensaje no bloqueante.

Sintaxis

En C

#include <mpi.h>
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype,
         int source, int tag, MPI_Comm comm, MPI_Request *request)

En C++

#include <mpi.h>
Request Comm::Irecv(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.
request Dato de tipo MPI_Request, en el se guarda una etiqueta que identifica la operación no bloqueante. Esto se utiliza para poder consultar, por ejemplo, si la operación ha finalizado, o poder esperar a que finalice en un momento dado. (Véase MPI_Wait).

Descripción

Esta función es para comenzar el recibimiento de un mensaje. Lo que hace es bloquear el proceso hasta que se le notifique la llegada de un mensaje. Cuando esto suceda, pedirá que se comience a recibir el mensaje, a la vez que continúa la ejecución del resto del proceso. Una vez nos es necesario utilizar el mensaje, es obligatorio utilizar alguna directiva de MPI para detener la ejecución (como MPI_Wait), o bien comprobar el estado del recibo (por ejemplo con MPI_Test).

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

Un breve ejemplo para utilizar este método:

int main(int argc, char *argv[])
{
    int rank, size;
    int *mensaje;
    MPI_Request request;
    MPI_Status status;
 
    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
 
    mensaje = new int[50000];
 
    if(rank == 1)
         MPI_Irecv (mensaje, // Buffer de recibo
               50000,  // Numero de elementos a recibir en el buffer
               MPI_INT, // Tipo de cada elemento
               0, // Rank del proceso origen
               1, // Etiqueta
               MPI_COMM_WORLD, // Comunicador utilizado
               &request); // Datos de la operacion
    ...
    // Calculos y operaciones del programa
    ...
 
    MPI_Wait(&request, &status);
    // Si sale de Wait, el mensaje ha sido recibido
 
    ...
    // Utilizamos los datos recibidos
    ...
 
    MPI_Finalize();
    return 0;
}

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, a veces 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.
MPI_ERR_INTERN Este error es devuelto si a la implementación de MPI le resulta imposible obtener memoria en algún momento durante el proceso de comunicación

Véase también

MPI_Recv
MPI_Probe
MPI_Test
MPI_Wait

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

Valid HTML 4.01 Transitional