MPI recv de una fuente desconocida


Estoy implementando en MPI un programa en el que el proceso principal (con rango=0) debería poder recibir solicitudes de los otros procesos que piden valores de variables que solo 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 eso ya que los procesos no se ejecutan en el orden 1,2,3,.... ¿Cómo puedo recibir la solicitud de cualquier rango y usar el número del proceso de emisión para enviar la información necesaria?

Author: shkk, 2010-12-03

2 answers

Esto supone que está usando C. Hay conceptos similares en C++ y Fortran. Solo debe especificar MPI_ANY_SOURCE como la fuente en el MPI_recv(). La estructura status 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);
 47
Author: KeithB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 17:26:08

MPI_ANY_SOURCE es la respuesta obvia.

Sin embargo, si todos los rangos enviarán una solicitud al rango 0, MPI_Irecv combinado con MPI_Testall también podría funcionar como un patrón. Esto permitirá que las llamadas MPI_Send se ejecuten en cualquier orden, y la información se puede recibir y procesar en el orden en que las llamadas MPI_Irecv coinciden.

 2
Author: Stan Graves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-04 16:29:59