Comprobación no bloqueante de llegada de mensaje.
#include <mpi.h> int MPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status)
#include <mpi.h> bool Comm::Iprobe(int source, int tag, Status& status) const bool Comm::Iprobe(int source, int tag) const
source | Indica el origen del que se espera recibir el mensaje. Este puede ser el rango (rank) de origen o bien MPI_ANY_SOURCE para cualquier origen. (int) |
tag | Valor de etiqueta esperado o bien MPI_ANY_TAG para cualquier valor de etiqueta (int). |
comm | Comunicador por el que se espera recibir el mensaje. |
flag | Entero que indica si se ha recibido algún mensaje con los parámetros establecidos. 0 si no ha recibido ningún mensaje, flag > 0 si lo ha recibido. |
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_Iprobe 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_Iprobe(source, tag, comm, flag, status) devuelve flag = true si hay algún mensaje que puede ser recibido y concuerda con lo especificado por los parámetros. El mensaje al que MPI_Iprobe hace referencia con los parámetros indicados, es exactamente el mismo que se recibiría con MPI_Recv con esos mismos parámetros ejecutado en ese mismo punto del programa. Si no hay ningún mensaje que concuerde con lo establecido, flag = false y el Status quedará indefinido.
El parámetro source de MPI_Iprobe 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.
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. |