Rutina de envío de mensaje de un único origen a un destino no bloqueante.
#include <mpi.h> int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
#include <mpi.h> Request Comm::Isend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const
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. |
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). |
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.
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; }
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 |