2017-10-12 24 views
1

Lorsque l'exécution du programme atteint une directive omp sections, les segments de programme définis par la directive omp section suivante sont distribués pour une exécution parallèle parmi les threads disponibles.Le thread d'origine exécute-t-il un des segments de programme définis par les directives `omp section`?

  • est le fil d'origine, à savoir le fil qui se déroule avant d'atteindre omp sections, l'un des fils qui exécutent l'un des segments de programme définies par les directives omp section?

  • Après que tous les threads aient fini d'exécuter leurs segments de programme définis par les directives omp section, le thread d'origine sera-t-il le seul à exister et à continuer l'exécution?

Dans l'exemple suivant, quel thread est le thread d'origine, 1 ou 2 ou autre chose?

#pragma omp sections 
{ 

    # pragma omp section 
    { printf("thread 1 here\n"); } 
    # pragma omp section 
    { printf("thread 2 here\n"); } 

} 

Merci.

Répondre

1

Votre exemple de code est incomplet. Terminons naïvement.

int main() 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { printf("thread 1 here\n"); } 
     # pragma omp section 
     {printf("thread 2 here\n"); } 
    } 
} 

Il n'y a qu'un seul fil ici. #pragma omp section seul ne crée aucun thread supplémentaire.

Vous utilisez sections dans une construction parallèle:

#pragma omp parallel 
{ 
    #pragma omp sections 

ce qui équivaut à

#pragma omp parallel sections 

La construction parallel crée une équipe de threads. Tous les threads s'exécutent jusqu'à la construction sections, chaque bloc section étant exécuté par l'un des threads de l'équipe.

Parler de threads entrée/sortie une section parallèle:

  • Oui, le fil qui se heurte à la construction parallel feront partie de la course de l'équipe. En fait, il deviendra son fil conducteur avec le numéro de fil 0. Il participera à l'exécution des sections si l'équipe exécute une construction sections. Il n'est cependant pas garanti qu'il exécutera une section quelconque, il n'y aura peut-être même pas assez de sections pour tous les threads. La méthode de planification de la section au thread dans une équipe est définie par l'implémentation.

  • Oui, après la fin d'une région parallel, le thread d'origine est le (seul) thread qui continuera l'exécution du code externe.

+0

Merci. Comment obtenez-vous le numéro d'identification de thread du thread actuel? – Ben

+0

'omp_get_thread_num()' – Zulan

+0

Y at-il une sorte de bouton OpenMP à tourner pour "encourager" le maître à exécuter l'une des sections? Il est moins qu'optimal que le thread maître soit suspendu (et abandonne volontairement sa tranche CPU) pour laisser les threads de travail exécuter chaque section, puisque le maître fait une jointure à la fin du bloc parallèle. – igaz