Maison > développement back-end > C++ > le corps du texte

Comment la clause « omp ordonnée » garantit-elle une exécution séquentielle dans une boucle parallèle dans OpenMP ?

Susan Sarandon
Libérer: 2024-10-25 10:42:31
original
154 Les gens l'ont consulté

How does the `omp ordered` clause ensure sequential execution within a parallel loop in OpenMP?

Comprendre la clause ordonnée omp

La clause ordonnée omp d'OpenMP coordonne l'exécution du thread pour garantir l'exécution séquentielle d'une section de code dans une boucle parallèle. Plusieurs threads s'exécutent simultanément jusqu'à ce qu'ils rencontrent la région ordonnée, où ils se synchronisent et procèdent dans le même ordre que dans une boucle série.

Considérez ce code :

<code class="cpp">vector<int> v;

#pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1)
for (int i = 0; i < n; ++i){
    ...
    ...
    ...
#pragma omp ordered
    v.push_back(i);
}</code>
Copier après la connexion

Ce code garantit que le vecteur v est rempli d'une liste ordonnée contenant n éléments.

Synchronisation des threads

Lorsque les threads rencontrent le bloc ordonné omp, ils doivent attendre que le thread exécutant le itération la plus basse possible. Cette synchronisation est critique car elle maintient l'ordre d'exécution spécifié dans la boucle série. La bibliothèque d'exécution OpenMP attribue généralement l'itération la plus basse au premier thread qui devient prêt à être exécuté.

Influence de la planification

Bien que la clause ordonnée puisse être utilisée avec les deux dynamiques et la planification statique, la planification dynamique est recommandée. Avec la planification statique, les itérations des threads sont définies de manière prédéterminée, ce qui peut conduire à une inactivité du thread si l'itération la plus basse est attribuée à un thread qui a déjà terminé ses itérations.

Avec la planification dynamique, les itérations sont attribuées au moment de l'exécution, réduisant la probabilité que les threads tournent au ralenti. Cependant, cela introduit une certaine surcharge, il ne doit donc être pris en compte que si le temps consacré à la planification dynamique est négligeable par rapport au temps d'exécution de la région ordonnée.

Exécution ordonnée avec plusieurs threads

Pour illustrer l'exécution ordonnée, considérons un scénario avec trois threads et neuf itérations, chaque thread étant responsable de trois itérations. Une planification statique avec une taille de bloc de 1 donnerait la chronologie d'exécution suivante :

tid  List of     Timeline
     iterations
0    0,3,6       ==o==o==o
1    1,4,7       ==.o==o==o
2    2,5,8       ==..o==o==o
Copier après la connexion

Avec une planification dynamique, la chronologie d'exécution serait aléatoire, car la liste des itérations attribuées à chaque thread ne serait pas déterministe .

En utilisant la planification dynamique avec la clause ordonnée, vous obtenez la concurrence tout en maintenant l'ordre d'exécution correct dans une boucle parallèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!