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_Isend

Descripción breve

Rutina de envío de mensaje de un único origen a un destino no bloqueante.

Sintaxis

En C

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

En C++

#include <mpi.h>
Request Comm::Isend(const void* buf, int count, const
            Datatype& datatype, int dest, int tag) const

Parámetros

De entrada

buf Dirección inicial del buffer de envío. Esto significa que requiere un puntero. Si solo se pretende enviar un elemento, se puede enviar el puntero a este (&elemento).
count Numero de elementos a enviar (Debe ser un entero no negativo).
datatype Tipo de dato de cada elemento que se va a enviar. Acepta constantes definidas por MPI (Véase el apartado de constantes). Por ejemplo MPI_INT.
dest Rango del proceso destino. (Véase MPI_Comm_rank)
tag Entero que representa la etiqueta del mensaje. 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.

De salida

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 sirve para realizar el envío de un mensaje desde un origen a un único destino de forma no bloqueante. Esto significa que la función devuelve el control a la ejecución del programa lo antes posible, es decir, hasta que el hardware y el sistema operativo sean capaces de realizar el resto del envío por sí solos. El proceso sería que la implementación de MPI prepara el mensaje (cabecera, destino, etiqueta...) y pide al sistema operativo la copia del mensaje al buffer de salida (reserva de memoria y transferencia de datos). Esto significa que no se puede asegurar que el mensaje se haya enviado excepto consultando a la variable MPI_Request.

Es común utilizar este método para enviar mensajes muy largos, ya que puede llevar tiempo cargarlo en el buffer, se puede comenzar el envío lo antes posible y continuar parte de la ejecución, hasta que sea estrictamente necesario conocer que se ha mandado el mensaje. En este caso, se puede hacer uso de la función MPI_Wait.

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

Una porción de código posible con esta función puede ser la siguiente:

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];
 
    ...
    // Rellenamos el mensaje
    ...
 
    MPI_Isend (mensaje, // Buffer de envio
               50000,  // Numero de elementos a enviar en el buffer
               MPI_INT, // Tipo de cada elemento
               1, // Rank del proceso destino
               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 enviado
 
    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_Send
MPI_Wait

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

Valid HTML 4.01 Transitional