2.3 Construction parallèle
La directive suivante définit une région parallèle, qui est une zone de programme qui doit être exécuté par plusieurs threads en parallèle. Il s'agit de l'élément fondamental qui commence l'exécution parallèle.
#pragma omp parallel [clause[ [, ]clause] ...] new-line
structured-block
La clause est l'une des opérations suivantes :
grandeur-expression**)desi (**
variable-liste**)deprivé (**
variable-liste**)defirstprivate (**
valeur par défaut (partagée | aucun)
variable-liste**)de(partagé**
variable-liste**)decopyin (**
variable-liste**)deNuméro de téléphone :** d'opérateur deréduction (
entier-expression**)denum_threads (**
Lorsqu'un thread rencontre un élément parallèle, une équipe de threads est créée si l'un des cas suivants est vrai :
aucune clause d' if n'est présente.
L'expression d' if prend une valeur différente de zéro.
Ce thread devient le thread principal de l'équipe, avec un nombre de threads de 0, et tous les threads de l'équipe, notamment le thread principal, exécutent la zone en parallèle. si la valeur de l'expression d' if est zéro, la zone est sérialisée.
Pour déterminer le nombre de threads qui sont demandés, les règles suivantes sont considérées comme dans l'ordre. La première règle dont la condition est satisfaite sera appliquée :
Si la clause de num_threads est présente, la valeur de l'expression entière est le nombre de threads demandés.
Si la fonction de bibliothèque d' omp_set_num_threads a été appelée, la valeur de l'argument dans l'appel récemment exécution est le nombre de threads demandés.
Si la variable d'environnement OMP_NUM_THREADS est définie, la valeur de cette variable d'environnement est le nombre de threads demandés.
Si aucune des méthodes ci-dessus n'a été utilisée, le nombre de threads demandés implémentation-est défini.
Si la clause de num_threads est présent puis elle remplace le nombre de threads demandés par la fonction de bibliothèque d' omp_set_num_threads ou la variable d'environnement OMP_NUM_THREADS uniquement pour la région parallèle qu'elle s'applique. Les régions parallèles suivantes ne sont pas affectées par elle.
Le nombre de threads qui exécutent la région parallèle également dépend au moment si le réglage dynamique du nombre de threads est activé. Si le réglage dynamique est désactivé, le nombre demandé de thread exécute la région parallèle. Si le réglage dynamique est activé le nombre demandé de threads est le nombre maximal de threads qui peuvent s'exécuter la région parallèle.
Si une région parallèle est produite lors de la modification dynamique du nombre de threads est désactivé, et le nombre de threads demandés pour la région parallèle dépasse le nombre que le système runtime peut fournir, le comportement du programme implémentation-est défini. Une implémentation peut, par exemple, interrompre l'exécution du programme, ou elle peut sérialiser la région parallèle.
La fonction de bibliothèque d' omp_set_dynamic et la variable d'environnement OMP_DYNAMIC peuvent être utilisées pour activer et désactiver le réglage dynamique du nombre de threads.
Le nombre de processeurs physiques qui hébergent réellement les threads à un moment donné implémentation-est défini. Une fois créées, le nombre de threads dans l'équipe reste constant pour la durée de cette zone parallèle. Elle peut être modifiée explicitement par l'utilisateur ou automatiquement par le système d'exécution d'une région parallèle à un autre.
Les instructions contenues dans l'étendue dynamique de la zone parallèle sont exécutées par chaque thread, et chaque thread peut exécuter un chemin d'accès des instructions qui est différent des autres threads. Les directives produites en dehors de l'étendue lexicale d'une région parallèle renvoie aux directives orphelines.
Il existe un cloisonnement implicite à la fin d'une zone parallèle. Seul le thread principal de l'équipe l'exécution se poursuit à la fin d'une zone parallèle.
Si un thread dans une équipe qui exécute une région parallèle rencontre un autre élément parallèle, elle crée une nouvelle équipe, et il devient la forme de base de cette nouvelle équipe. Les régions parallèles imbriquées sont sérialisées par défaut. En conséquence, par défaut, une région parallèle imbriquée est exécutée par l'équipe composée d'un thread. Le comportement par défaut peut être modifié à l'aide de la fonction de la bibliothèque Runtime omp_set_nested ou de la variable d'environnement OMP_NESTED. Toutefois, le nombre de threads dans une équipe qui exécutent une région parallèle imbriquée implémentation-est défini.
Les restrictions à la directive de parallèle sont les suivantes :
Au plus une clause d' if peut apparaître sur la directive.
Il n'est pas spécifiée si tous les effets secondaires à l'intérieur de si l'expression ou l'expression de num_threads se produisent.
Un intérieur exécuté par throw une région parallèle doit provoquer l'exécution au résumé dans l'étendue dynamique du même bloc structuré, et il doit être intercepté par le même thread qui a levé l'exception.
Uniquement une clause unique de num_threads peut apparaître sur la directive. L'expression de num_threads est évaluée en dehors de le contexte de la zone parallèle, et doit prendre une valeur entière positive.
L'ordre d'évaluation des clauses d' if et de num_threads n'est pas spécifiée.
Références croisées :
privé, firstprivate, valeur par défaut, partagé, copyin, et les clauses de réduction , consultez section 2.7.2 à la page 25.
Variable d'environnementOMP_NUM_THREADS , section 4,2 à la page 48.
la fonction de bibliothèque d'omp_set_dynamic , consultez section 3.1.7 à la page 39.
La variable d'environnementOMP_DYNAMIC , consultez section 4,3 à la page 49.
la fonction d'omp_set_nested , consultez section 3.1.9 à la page 40.
La variable d'environnementOMP_NESTED , consultez section 4,4 à la page 49.
la fonction de bibliothèque d'omp_set_num_threads , consultez section 3.1.1 à la page 36.