¿Por qué mi progtwig MPI está dando de manera incorrecta?

Soy un novato en MPI y tengo una tarea, no te estoy pidiendo que la resuelvas, solo necesito una pista sobre por qué mi progtwig no funciona correctamente.

Aquí está el problema

Escribe un progtwig MPI C que simule un juego de mesa de ping pong. 2 procesos solo deben ser utilizados. Los procesos utilizan MPI_Send y MPI_Recv para intercambiar continuamente mensajes entre sí, un número específico de veces. El mensaje está formado por una variable de conteo de enteros que se incrementa por cada proceso antes de ser enviado. La variable de conteo se inicializa a cero antes de comenzar el juego.

Salida

Un archivo de texto llamado ping_pong_output.txt se formó como el siguiente ejemplo: si cuenta = 5

El proceso 0 inició el juego e inicializó el conteo El proceso 0 incrementó el conteo (1) y lo envió al proceso 1

El proceso recibió el conteo El proceso 0 incrementó el conteo (2) y lo envió de vuelta al proceso 0

El proceso recibió el conteo El proceso 0 incrementó el conteo (3) y lo envió de vuelta al proceso 1

El proceso recibió el conteo El proceso 0 incrementó el conteo (4) y lo envió de vuelta al proceso 0

El proceso recibió el conteo El proceso 0 incrementó el conteo (5) y lo envió de vuelta al proceso 1

Tenga en cuenta lo siguiente:

  • Los procesos se turnan para ser el remitente y el destinatario (se debe usar%)
  • El progtwig debe permitir solo 2 procesos para jugar el juego.

El codigo que escribi

#include  #include  #include  #include  int main(int argc, char * argv[]){ int size=0,my_rank=0,tag=1,count; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); MPI_Barrier(MPI_COMM_WORLD); if (my_rank==0){ count=0; count++; printf("Process 0 started the game and initialized the count\nProcess 0 incremented the count and sent it to process 1\n"); MPI_Send(&count,1,MPI_INT,1,tag,MPI_COMM_WORLD); } MPI_Barrier(MPI_COMM_WORLD); while (count<=5){ MPI_Barrier(MPI_COMM_WORLD); MPI_Recv(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD,&status); printf("Process %d received the count\n",my_rank); count++; MPI_Send(&count,1,MPI_INT,(my_rank+1)%2,tag,MPI_COMM_WORLD); printf("process %d incremented the count (%d) & sent it back to process %d\n",my_rank,count,(my_rank+1)%2); } MPI_Finalize(); return 0; } 

La salida que tengo es:

Proceso 1 recibió el conteo.

el proceso 1 incrementó el conteo (2) y lo envió de vuelta al proceso 0

Proceso 1 recibió el conteo.

el proceso 1 incrementó el conteo (4) y lo envió de vuelta al proceso 0

Proceso 1 recibió el conteo.

el proceso 1 incrementó el conteo (6) y lo envió de vuelta al proceso 0

El proceso 0 comenzó el juego e inicializó el conteo.

El proceso 0 incrementó el conteo y lo envió al proceso 1

Proceso 0 recibió el conteo.

el proceso 0 incrementó el conteo (3) y lo envió de vuelta al proceso 1

Proceso 0 recibió el conteo.

el proceso 0 incrementó el conteo (5) y lo envió de vuelta al proceso 1

Proceso 0 recibió el conteo.

el proceso 0 incrementó el conteo (7) y lo envió de vuelta al proceso 1

No entiendo por qué el proceso 1 se ejecuta primero, incluso el bucle se ejecuta antes de la instrucción if. Todos esos MPI_Barrier son probablemente inútiles pero salieron de la desesperación. Cualquier ayuda es apreciada.

Para cualquier persona que pudiera estar buscando la respuesta, logré descubrir que debería dejar que un proceso maneje toda la impresión.

Ese es un enfoque. El problema que está encontrando está relacionado con el lavado de salida. El uso de printf enviará datos a la salida estándar, pero la salida estándar no se descarga de inmediato. Dado que cada rango se eliminará en su propio momento (en este caso, lo más probable es que al final de la ejecución), obtendrá todo al final, y ambos rangos se agruparán. La solución más fácil que conozco que mantendrá la estructura original de su progtwig es agregar fflush (stdout) después de cada llamada a printf. Esto obliga a que el búfer se vacíe, lo que mostrará la salida.