Sortir gracieusement avec MPI

J’essaie de quitter gracieusement mon programme après si Rdinput renvoie une erreur.

#include  #include  #include  #define MASTER 0 #define Abort(x) MPI_Abort(MPI_COMM_WORLD, x) #define Bcast(send_data, count, type) MPI_Bcast(send_data, count, type, MASTER, GROUP) //root --> MASTER #define Finalize() MPI_Finalize() int main(int argc, char **argv){ //Code if( rank == MASTER ) { time (&start); printf("Initialized at %s\n", ctime (&start) ); //Read file error = RdInput(); } Bcast(&error, 1, INT); Wait(); if( error = 1 ) MPI_Abort(1); //Code Finalize(); } 

Sortie du programme:

 mpirun -np 2 code.x -------------------------------------------------------------------------- MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD with errorcode 1. NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. You may or may not see output from other processes, depending on exactly when Open MPI kills them. -------------------------------------------------------------------------- Initialized at Wed May 30 11:34:46 2012 Error [RdInput]: The file "input.mga" is not available! -------------------------------------------------------------------------- mpirun has exited due to process rank 0 with PID 7369 on node einstein exiting improperly. There are two reasons this could occur: //More error message. 

Que puis-je faire pour quitter gracieusement un programme MPI sans imprimer ce gros message d’erreur?

Si vous avez cette logique dans votre code:

 Bcast(&error, 1, INT); if( error = 1 ) MPI_Abort(1); 

alors vous avez presque fini (bien que vous n’ayez pas besoin d’attendre après une émission). L’astuce, comme vous l’avez découvert, est que MPI_Abort() ne fait pas “graceful”; il s’agit essentiellement de fermer les choses de toutes les manières possibles lorsque quelque chose ne va pas du tout.

Dans ce cas, puisque tout le monde s’accorde sur le code d’erreur après la diffusion, il suffit de faire une fin gracieuse de votre programme:

  MPI_Bcast(&error, 1, MPI_INT, MASTER, MPI_COMM_WORLD); if (error != 0) { if (rank == 0) { fprintf(stderr, "Error: Program terminated with error code %d\n", error); } MPI_Finalize(); exit(error); } 

C’est une erreur d’appeler MPI_Finalize() et de continuer avec plus de choses MPI, mais ce n’est pas ce que vous faites ici, donc ça va.