Pregunta

Me estoy poniendo en práctica un programa de MPI en el que el proceso principal (con rango = 0) debe ser capaz de recibir solicitudes de los otros procesos que solicitan valores de las variables que sólo son conocidos por la raíz. Si hago MPI_Recv (...) por el rango 0, tengo que especificar el rango del proceso que envía la solicitud a la raíz, pero no puedo controlar que, dado que los procesos no se ejecutan en el orden 1,2,3 , .... ¿Cómo puedo recibir la solicitud de cualquier rango y utilizar el número del proceso de emisión para enviar la información necesaria?

¿Fue útil?

Solución

Esto supone que está utilizando C. Hay conceptos similares en C ++ y Fortran. Usted acaba de especificar MPI_ANY_SOURCE como la fuente en el MPI_recv(). La estructura de estado contiene la fuente real del mensaje.

int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);

Otros consejos

MPI_ANY_SOURCE es la respuesta obvia.

Sin embargo, si todas las filas estarán enviando una solicitud a la fila 0, entonces MPI_Irecv combinado con MPI_Testall también podría funcionar como un patrón. Esto permitirá que las llamadas MPI_Send a ser ejecutadas en cualquier orden, y la información pueden ser recibidos y procesados ??en el orden en que las llamadas se hacen coincidir MPI_Irecv.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top