Forum Programmation.c++ OpenMP, synchronisation

Posté par .
Tags :
3
1
juin
2012

Bonjour tout le monde, j'ai un problème de synchronisation avec openMP:

J'ai un morceau de code multithreadé. En fin de ce bloc, je voudrais synchroniser les données créées par mes différents process.
Pour cela, je dois rapatrier ces données dans celles du thread 0.
Je dois donc absolument attendre que ce dernier ait terminé de travailler avant de commencer la synchro. Pour l'instant, je fais ça :

#pragma omp parallel
{
 Bla
 Bla
 Bla
#pragma omp barrier
 //On est certain que le thread 0 a terminé

#pragma omp critical
 {
   if(thread >0) do stuff
 }
}

Mon problème, c'est qu'avec une barrière, je dois attendre tout le monde, alors que je ne voudrais attendre QUE le thread 0.

Ma question est donc :
Est-il possible de bloquer les autres threads tant que le thread 0 n'est pas arrivé ? (s'il arrive en premier, on ne bloque personne)

Merci beaucoup

  • # Sémaphores

    Posté par (page perso) . Évalué à 5.

    Évidemment ce n'est pas du tout dans l'esprit d'openMP où la mécanique des filaments est supposément camouflée, mais pourquoi ne pas employer un sémaphore ?

    Au début de la zone parallèle le filament 0 le ferme (sem_init à valeur négative), et une barrière impose aux autre processus d'attendre que la fermeture soit effective. Ensuite, à la place du #pragma omp barrier, le processus 0 ouvre le sémaphore (sem_post nthread fois) autant de fois qu'il y a d'autre filaments. Les autres filaments eux exécutent une portion de code les faisant attendre l'ouverture (sem_wait). Une fois que le boulot est achevé, un petit coup de omp barrier pour que le filament maître puisse détruire le sémaphore en toute quiétude.

    • [^] # Re: Sémaphores

      Posté par . Évalué à 1.

      Ah,
      OK, merci, je vais essayer ça !
      (je ne connais pas trop les pthreads, je viens plutôt du mpi à la base :-) )

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.