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_Test

Descripción breve

Comprueba si una operación específica de envío o de recibimiento se ha completado.

Sintaxis

En C

#include <mpi.h>
int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)

En C++

#include <mpi.h>
bool Request::Test(Status& status)
bool Request::Test()

Parámetros

De entrada

request Dato de tipo MPI_Request, en el se guarda una etiqueta que identifica una operación no bloqueante. (Véase por ejemplo MPI_Isend).

De salida

flag Indica si la operación que se está comprobando ha terminado de realizarse. En caso afirmativo, se devuelve con el valor de 1, 0 en caso contrario.
status Objeto de tipo MPI_Status, contiene datos relevantes sobre el mensaje (como son el origen (MPI_SOURCE), la etiqueta (MPI_TAG) y el tamaño (size)).

Descripción

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;
}

Errores

MPI_SUCCESS No ha habido error, la función MPI se ha realizado satisfactoriamente.
MPI_ERR_REQUEST Objeto no válido de MPI_Request. Generalmente sucede porque tiene valor nulo.
MPI_ERR_ARG Ha recibido un argumento incorrecto no especificado por un error específico de clase (como MPI_ERR_RANK).

Véase también

MPI_Isend
MPI_Irecv
MPI_Wait

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

Valid HTML 4.01 Transitional