Quand dois-je utiliser MPI Barrier()?

je me demande Quand dois - je utiliser la barrière? Ai-je besoin avant/après un scatter/gather par exemple? Ou L'OMPI devrait-elle s'assurer que tous les processus ont atteint ce point avant d'être dispersés/rassemblés? De même, après une diffusion, puis-je m'attendre à ce que tous les processus reçoivent déjà le message?

25
demandé sur Paul Price 2012-11-09 13:59:11

3 réponses

toutes les opérations collectives en MPI avant MPI-3.0 sont bloquées, ce qui signifie qu'il est sûr d'utiliser tous les tampons qui leur sont passés après leur retour. En particulier, cela signifie que toutes les données ont été reçues lorsque l'une de ces fonctions retourne. (Toutefois, cela ne signifie pas que toutes les données ont été envoyées!) Donc MPI_Barrier n'est pas nécessaire (ou très utile) avant/après les opérations collectives, si tous les tampons sont déjà valides.

veuillez noter aussi que MPI_Barrier n'attend pas par magie appels non bloquants. Si vous utilisez un send / recv non-bloquant et que les deux processus attendent à un MPI_Barrier après la paire send/recv, il n'est pas garanti que les processus ont envoyé/reçu toutes les données après le MPI_Barrier. Utilisez MPI_Wait (and friends) à la place. Ainsi, le code suivant contient des erreurs:

/* ERRORNOUS CODE */

Code for Process 0:
Process 0 sends something using MPI_Isend
MPI_Barrier(MPI_COMM_WORLD);
Process 0 uses buffer passed to MPI_Isend // (!)

Code for Process 1:
Process 1 recvs something using MPI_Irecv
MPI_Barrier(MPI_COMM_WORLD);
Process 1 uses buffer passed to MPI_Irecv // (!)

les Deux lignes qui sont marqués par (!) sont dangereux!

MPI_Barrier n'est utile que dans une poignée de cas. La plupart du temps, vous ne vous souciez pas si vos processus synchroniser. Pour en savoir plus sur les appels bloquants et non bloquants!

23
répondu Markus Mayr 2012-11-09 11:53:17

MPI_Barrier est par exemple pour contrôler l'accès à une ressource externe telle que le système de fichiers, qui n'est pas accessible en utilisant MPI. Par exemple, si vous voulez que chaque processus écrive des trucs dans un fichier en séquence, vous pouvez le faire comme ceci:

int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
for ( int ii = 0; ii < size; ++ii ) {
    if ( rank == ii ) {
        // my turn to write to the file
        writeStuffToTheFile();
    }
    MPI_Barrier(MPI_COMM_WORLD);
}

de cette façon, vous pouvez être sûr qu'il n'y a pas deux processus appelant simultanément writeStuffToTheFile.

13
répondu Edric 2012-11-09 13:13:27

Peut MPI_Barrier() n'est pas souvent utilisé, mais il est utile. En fait, même si vous utilisiez la communication synchrone, MPI_Send/Recv() ne peut que s'assurer que les deux processus sont synchronisés. Dans mon projet, un projet cuda+MPI, tout ce que j'ai utilisé c'est la communication asynchrone. J'ai constaté que dans certains cas, si je n'utilise pas la fonction MPI_Barrier () suivie de la fonction Wait (), la situation dans laquelle deux processus(gpu) veulent transmettre des données en même temps est très probable, ce qui pourrait mal de réduire l'efficacité du programme. Le bug au-dessus de moi me rend fou et me prend quelques jours pour le trouver. Par conséquent, vous pouvez penser avec soin si vous utilisez MPI_Barrier() lorsque vous avez utilisé MPI_Isend/Irecv dans votre programme. Parfois synchroniser les processus est non seulement nécessaire, mais doit également, en particulier ur programme traite de l'appareil.

0
répondu Freezenfire 2015-09-29 11:17:21