Envía y recibe un mensaje en la misma operación.
#include <mpi.h> int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)
#include <mpi.h> void Comm::Sendrecv(const void *sendbuf, int sendcount, const Datatype& sendtype, int dest, int sendtag, void *recvbuf, int recvcount, const Datatype& recvtype, int source, int recvtag, Status& status) const void Comm::Sendrecv(const void *sendbuf, int sendcount, const Datatype& sendtype, int dest, int sendtag, void *recvbuf, int recvcount, const Datatype& recvtype, int source, int recvtag) const
sendbuf | Posición inicial del buffer de salida. |
sendcount | Número de elementos (del tipo de dato especificado) a enviar (int). |
sendtype | Tipo de los datos que contiene el buffer de salida (Como por ejemplo MPI_INT). |
dest | Rango del destino. |
sendtag | Etiqueta para el mensaje de salida. |
recvcount | Máximo número de elementos (del tipo especificado) a recibir (int). |
recvtype | Tipo de los datos que contendrá el buffer de entrada (Como por ejemplo MPI_INT). |
source | Rango del origen del que recibir el mensaje (o bien MPI_ANY_SOURCE). |
recvtag | Etiqueta del mensaje a recibir, o bien MPI_ANY_TAG para cualquier valor de etiqueta. |
comm | Comunicador por el que se va a realizar tanto el envío como la operación de recibimiento. |
recvbuf | Dirección inicial del buffer de entrada (de recibimiento). |
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 send-receive combinan en una sola llamada el envío de un mensaje a un destino y la recepción de otro mensaje, desde otro proceso. Los dos (origen y destino) pueden ser el mismo. Esta operación es útil para ejecutar una operación de desplazamiento a través de una cadena de procesos.
Un mensaje enviado con una operación send-receive puede ser recibido o comprobado (MPI_Probe) por una operación de recepción o comprobación normal. Esta operación también puede recibir mensajes de envíos normales (como MPI_Send).
MPI_Sendrecv es una operación bloqueante, tanto el envío como la recepción se realizan por el mismo comunicador. Los bufferes de envío y de recepción deben ser disjuntos, pueden tener distintos tipos y tamaños.
Si tu programa no necesita utilizar el parámetro status, se pueden ahorrar recursos utilizando la constante predefinida MPI_STATUS_IGNORE como valor especial.
MPI_SUCCESS | No ha habido error, la función se ha completado satisfactoriamente. |
MPI_ERR_COMM | Comunicador no válido. Un error común es usar un comunicador nulo. |
MPI_ERR_COUNT | Valor no válido del argumento count. Debe ser un valor no negativo, a veces se permite un valor cero. |
MPI_ERR_TYPE | Tipo de dato especificado no válido. Puede ser un tipo de dato (MPI_Datatype) para el que aún no se ha hecho commit (Véase MPI_Type_commit). |
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. |