Al usar MPI, parece que se recibió un mensaje antes de enviarlo
multithreading parallel-processing (2)
¿Cómo puede estar tan seguro de que el proceso 0 recibió el mensaje antes de enviarlo? Considero que es mucho más probable que el printf se haya almacenado o retrasado.
Printf no garantiza que sea instantáneo, para hacerlo más receptivo. Ejecute esto al comienzo de su código para evitar el almacenamiento en búfer de salida con printf:
setbuf(stdout, NULL);
En mi programa de prueba a continuación, estoy enviando un mensaje de un proceso a otro. Las trazas de impresión parecen indicar qué mensaje se está recibiendo antes de enviarlo, ¿por qué es así?
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
/* Run with two processes */
void main(int argc, char *argv[]) {
int rank, i, count;
float data[100],value[200];
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
printf("before if:%d/n",rank);
if(rank==1) {
printf("in if:%d/n",rank);
for(i=0;i<100;++i) data[i]=i;
MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);
} else {
printf("else:%d/n",rank);
MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
printf("P:%d Got data from processor %d /n",rank, status.MPI_SOURCE);
MPI_Get_count(&status,MPI_FLOAT,&count);
printf("P:%d Got %d elements /n",rank,count);
printf("P:%d value[5]=%f /n",rank,value[5]);
}
MPI_Finalize();
}
/ para ejecutar el programa para 8 procesos obtuve el siguiente resultado. cómo podría procesar 0 recibir antes de que el proceso 1 envíe /
- RESULT:
-before if:4/n
-before if:8/n
-else:8/n
-before if:0/n
-else:0/n
-P:0 Got data from processor 1/n
-P:0 Got 100 elements /n
-P:0 value[5]=5.000000 /n
-before if:1/n
-in if:1/n
-before if:2/n
-else:2/n
-before if:5/n
-else:5/n
-before if:6/n
-else:6/n
-before if:7/n
-else:7/n -before if:9/n -else:9/n -else:4/n -before if:3/n -else:3/n
*/
El problema aquí no es que haya roto la causalidad del tiempo, solo que MPI no garantiza el orden de los mensajes de impresión en la pantalla (consulte MPI - Impresión en un pedido para obtener más información).
MPI reenvía todo su stdout
y stderr
al proceso que llamó a mpiexec
/ mpirun
antes de imprimirlo en la pantalla (ya que es allí donde el usuario está conectado. Esos mensajes provenientes de todos los procesos diferentes pueden llegar en cualquier orden para que pueda estar ver una línea diciendo que se recibió un mensaje antes de que aparezca otra línea que indique que se envió el mensaje. Los mensajes siguen apareciendo en el orden correcto, solo se están retrasando en los canales de comunicación a lo largo del camino.