Comprobación bloqueante de llegada de mensaje.
#include <mpi.h> int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status)
#include <mpi.h> void Comm::Probe(int source, int tag, Status& status) const void Comm::Probe(int source, int tag) const
source | Rango del origen o MPI_ANY_SOURCE para cualquier origen(int). |
tag | Valor de etiqueta o bien MPI_ANY_TAG para cualquier etiqueta(int). |
comm | Comunicador por el que se realiza la comunicación (Por ejemplo MPI_COMM_WORLD). |
status | Dato 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)). |
La operación MPI_Probe permite comprobar si hay mensajes pendientes de ser recibidos, pero sin llegar a recibirlos. Esto permitirá decidir cómo recibirlos basándose en la información obtenida por el dato MPI_Status, por ejemplo, reservando memoria para él.
MPI_Probe(source, tag, comm, status) devuelve el control al programa si recibe algún mensaje con los parámetros especificados.
El parámetro source de MPI_Probe puede ser MPI_ANY_SOURCE y la etiqueta (tag) puede ser MPI_ANY_TAG, esto permite comprobar la recepción de cualquier mensaje con cualquier etiqueta. Sin embargo siempre es necesario especificar el comunicador por el que se realiza la comunicación.
Un ejemplo gráfico del funcionamiento de MPI_Probe es el siguiente:
Si tu programa no necesita utilizar el parámetro status, se pueden ahorrar recursos utilizando la constante predefinida MPI_STATUS_IGNORE como valor especial.
No es estrictamente necesario recibir el mensaje inmediatamente despues de que haya sido comprobado. Además se puede comprobar el mismo mensaje varias veces antes de que sea recibido.
MPI_SUCCESS | No hay error, la rutina ha terminado correctamente. |
MPI_ERR_COMM | Comunicador no válido. Un error común es usar un comunicador nulo. |
MPI_ERR_TAG | Valor de etiqueta no válido. Las etiquietas no pueden ser negativas, en las operaciones de recibimiento (MPI_Recv, MPI_Irecv, MPI_Sendrecv, etc.) se puede utilizar MPI_ANY_TAG. El mayor valor posible de etiqueta queda definido por la constante MPI_TAG_UB. |
MPI_ERR_RANK | Valor no válido de origen o de destino. Los rangos deben tener un valor entre cero y el tamaño del comunicador menos uno. Los rangos en las operaciones de recibimiento(MPI_Recv, MPI_Irecv, MPI_Sendrecv, etc.) también pueden valer MPI_ANY_SOURCE. |