8
votes

Problèmes OpenMPI MPI_Barrier

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();


0 commentaires

4 Réponses :


14
votes

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 ( stdout ) pour cela afin qu'il doit toujours être un problème de commande. (Et fflush ne vous aide pas ici, stdout est tamponné de la ligne tamponnée de toute façon.)

Vous pouvez essayer de préfixer votre sortie avec un horodatage et de sauvegarder tout cela à différents fichiers, un par processus MPI.

puis pour inspecter votre journal, vous pouvez fusionner les deux fichiers ensemble et trier en fonction de l'horodatage.

Votre problème devrait disparaître, alors.


4 commentaires

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 () n'est généralement pas une horloge globale / synchronisée! (C'est seulement si mpi_wtime_is_global est défini et vrai)


AFAIK, MPI_WTIME IN OPENMPI n'est pas synchronisé.




3
votes

La commande de sortie n'est pas garantie dans les programmes MPI.

Ceci n'est pas lié à MPI_Barrier du tout.

En outre, je ne passerais pas trop de temps à vous inquiéter de la commande de sortie avec les programmes MPI.

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.

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é.


0 commentaires

0
votes

Ajout aux réponses précédentes ici, votre MPI_Barrier fonctionne bien.

Cependant, si vous avez l'intention de le voir fonctionner, vous pouvez forcer une pause l'exécution ( Sleep (1) ) pour un instant pour que la sortie soit rattraper la sortie.


0 commentaires