Comprueba si una operación específica de envío o de recibimiento se ha completado.
Es una función local que comprueba si la operación especificada por parámetros ha terminado. En caso afirmativo, devolverá verdadero y se rellenará el parámetro status con toda la información relevante sobre el mensaje (Véase MPI_STATUS) y el parámetro de entrada request quedará con valor MPI_REQUEST_NULL. En otro caso, se devolverá un valor falso (o 0), entonces el parámetro de entrada request no se modifica y el parámetro de salida status tendrá un valor desconocido.
En el siguiente ejemplo, podemos ver cómo después de comenzar el recibo de un mensaje muy grande, trabajamos en un bucle y comprobamos de mientras si se ha recibido o no. En caso afirmativo, se termina el bucle y se trabaja con los datos.
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
bool recibido = false;
int flag;
while(!recibido){
...
MPI_Test (&request, // Datos que identifican a la operacion
&flag, // Entero que indica si se ha terminado
&status); // Datos del mensaje en caso positivo
if(flag == 1) // Se ha recibido el mensaje
recibido = true;
...
}
...
// Utilizamos los datos recibidos
...
MPI_Finalize();
return 0;
}