J'ai des problèmes de synchronisation à l'aide de la mise en œuvre OpenMPI de MPI_Barrier:
int rank; int nprocs; int rc = MPI_Init(&argc, &argv); if(rc != MPI_SUCCESS) { fprintf(stderr, "Unable to set up MPI"); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf("P%d\n", rank); fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); printf("P%d again\n", rank); MPI_Finalize();
4 Réponses :
L'ordre dans lequel vos lignes d'impression apparaissent sur votre terminal n'est pas nécessairement l'ordre dans lequel les choses sont imprimées. Vous utilisez une ressource partagée ( Vous pouvez essayer de préfixer votre sortie avec un horodatage et de sauvegarder tout cela à différents fichiers, un par processus MPI. P>
puis pour inspecter votre journal, vous pouvez fusionner les deux fichiers ensemble et trier en fonction de l'horodatage. P>
Votre problème devrait disparaître, alors. P> stdout code>) pour cela afin qu'il doit toujours être un problème de commande. (Et
fflush code> ne vous aide pas ici,
stdout code> est tamponné de la ligne tamponnée de toute façon.) P>
S'appuyant sur des horodatés peut ne pas être idéal si les processus MPI fonctionnent sur différents nœuds, sauf si vous pouvez garantir que les horloges sont synchronisées.
@Shawn: Il y a MPI_WTime () pour cela.
@suszterpatt: MPI_WTime () code> n'est généralement pas une horloge globale / synchronisée! (C'est seulement si
mpi_wtime_is_global code> est défini et vrai)
AFAIK, MPI_WTIME IN OPENMPI n'est pas synchronisé.
La commande de sortie n'est pas garantie dans les programmes MPI. p>
Ceci n'est pas lié à MPI_Barrier du tout. p>
En outre, je ne passerais pas trop de temps à vous inquiéter de la commande de sortie avec les programmes MPI. P>
Le moyen le plus élégant d'y parvenir, si vous voulez vraiment, est de laisser les processus envoyer leurs messages à un rang, par exemple, classez 0 et laissez le rang 0 imprimer la sortie dans l'ordre qu'il a reçu ou commandé par rangs. p>
Encore une fois, ne passez pas trop de temps à essayer de commander la production des programmes MPI. Ce n'est pas pratique et a peu d'utilité. P>
Ajout aux réponses précédentes ici, votre MPI_Barrier fonctionne bien. P>
Cependant, si vous avez l'intention de le voir fonctionner, vous pouvez forcer une pause l'exécution ( Sleep (1) code>) pour un instant pour que la sortie soit rattraper la sortie. P>