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
24
A
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);
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.
Cuestiones relacionadas
- 1. MPI no bloqueo de envío/recv
- 2. ¿Necesito tener un MPI :: Irecv correspondiente para un MPI :: Isend?
- 3. Manejo de retorno parcial desde recv() TCP en C
- 4. recv() devuelve 0
- 5. Cargando biblioteca compartida en open-mpi/mpi-run
- 6. Variables globales y MPI
- 7. Sección crítica en MPI?
- 8. MPI y C construye
- 9. MPI - Transmisión asíncrona/Reúna
- 10. Linux: ¿hay una lectura o recv desde el socket con timeout?
- 11. ¿MPI o zócalos?
- 12. MPI ¿Número de procesadores?
- 13. MPI: ¿núcleos o procesadores?
- 14. recv con MSG_NONBLOCK y MSG_WAITALL
- 15. recv() con longitud cero es válido?
- 16. cómo detectar una excepción desconocida e imprimirla
- 17. Matriz de una longitud desconocida en C#
- 18. Groovy: escapando una expresión regular arbitraria (desconocida)
- 19. Serialización y restauración de una clase desconocida
- 20. Implementación de MPI para Java
- 21. ¿Qué biblioteca python mpi usar?
- 22. ¿Spread vs MPI vs zeromq?
- 23. ¿Cómo depuro un programa MPI?
- 24. instalando OpenSSL desde la fuente
- 25. Netbeans MPI C++ ¿cómo comenzar?
- 26. Explicación de OpenMP y MPI
- 27. ¿Cómo compilar MPI con gcc?
- 28. mpi: bloqueo vs no bloqueo
- 29. C# HPC - MPI y OpenMP
- 30. Si un recv no bloqueante con MSG_PEEK tiene éxito, ¿tendrá éxito un recv posterior sin MSG_PEEK?
muchas gracias! No lo sabía, pero de hecho muy útil. – shkk
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
@Marius Gracias, volví a la versión original y agregué un par de comentarios a hacer las cosas más claras. – KeithB