Operación de recibo de mensaje no bloqueante.
#include <mpi.h> int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
#include <mpi.h> Request Comm::Irecv(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. |
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 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).
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; }
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 |