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

Comment la clause « omp ordonné » assure-t-elle une exécution séquentielle dans les régions parallèles ?

Susan Sarandon
Libérer: 2024-10-28 03:12:01
original
244 Les gens l'ont consulté

How Does the

Exploration de la clause « omp ordonné » : comprendre sa fonction et son utilisation

La clause « omp ordonné » est un mécanisme de synchronisation utilisé dans OpenMP pour imposer une exécution séquentielle dans une région parallèle. Il garantit que les blocs de code couverts par la construction « ordonnée » seront exécutés dans le même ordre que dans une boucle série.

Comment ça marche ?

Lorsque les threads rencontrent une région « ordonnée par omp », ils entrent dans un point de synchronisation. Le thread portant le numéro le plus bas exécutant actuellement du code en dehors de la région « ordonnée » reprend l'exécution, tandis que les autres threads attendent. Une fois que le thread portant le numéro le plus bas quitte la région « ordonnée », le thread suivant portant le numéro le plus bas entre, et ainsi de suite.

Allocation des threads

Contrairement aux inquiétudes, le La bibliothèque d'exécution OpenMP garantit que l'itération la plus basse est toujours attribuée à un thread. Si aucun des threads n'a initialement l'itération la plus basse, le runtime redistribue les itérations jusqu'à ce qu'un thread la reçoive.

Planification dynamique ou statique

Le choix entre dynamique et statique la planification lors de l'utilisation de la clause "ordonnée" dépend de la structure du code. La planification dynamique permet aux threads d'exécuter des itérations dans n'importe quel ordre, tandis que la planification statique garantit que les threads terminent les itérations de manière séquentielle.

En général, la planification dynamique est recommandée avec la clause « ordonnée » pour minimiser les temps d'inactivité. Avec la planification statique et la taille de fragment par défaut, comme décrit ci-dessous, les performances peuvent souffrir en raison d'une attente inutile.

Exemple avec la planification statique

Considérez un code avec 3 threads et 9 itérations :

<code class="cpp">#pragma omp parallel for ordered schedule(static)
for (int i = 0; i < 9; ++i) {
  ...
  #pragma omp ordered
  v.push_back(i);
}</code>
Copier après la connexion

La planification statique avec la taille de bloc par défaut signifie que le thread 0 traite les itérations 0 à 2, le thread 1 les traite 3 à 5 et le thread 2 les traite 6 à 8. La clause « ordonnée » introduit une dépendance, ce qui donne la chronologie suivante :

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

Conclusion

La clause « omp ordonnée » fournit une exécution séquentielle dans des régions parallèles. Il est recommandé d'utiliser la planification dynamique avec « ordonné » pour minimiser les temps d'inactivité. Le choix de la stratégie de planification appropriée dépend de la structure spécifique du code et des considérations de performances.

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