2010-12-03 14 views
24

Implemento en MPI un programa en el que el proceso principal (con rango = 0) debería poder recibir solicitudes de los otros procesos que solicitan valores de variables que solo son conocidas 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 desde cualquier rango y usar el número del proceso de emisión para enviarle la información necesaria?MPI recv desde una fuente desconocida

Respuesta

44

Esto supone que está utilizando C. Hay conceptos similares en C++ y Fortran. Debería especificar MPI_ANY_SOURCE como 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); 
+0

muchas gracias! No lo sabía, pero de hecho muy útil. – shkk

+0

Me parece que la edición hizo que el código no se pueda usar. La estructura 'status' se usa efectivamente para la operación' MPI_Send' para identificar el origen del mensaje original: 'status.MPI_SOURCE' – Marius

+1

@Marius Gracias, volví a la versión original y agregué un par de comentarios a hacer las cosas más claras. – KeithB

2

MPI_ANY_SOURCE es la respuesta obvia.

Sin embargo, si todos los rangos enviarán una solicitud al rango 0, entonces 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 coinciden las llamadas MPI_Irecv.