Fonctions OpenMP
Fournit des liens vers des fonctions utilisées dans l’API OpenMP.
L’implémentation Visual C++ de la norme OpenMP inclut les fonctions et types de données suivants.
Pour l’exécution de l’environnement :
Fonction | Description |
---|---|
omp_set_num_threads | Définit le nombre de threads dans les régions parallèles à venir, sauf en cas de substitution par une clause num_threads . |
omp_get_num_threads | Retourne le nombre de threads dans la région parallèle. |
omp_get_max_threads | Retourne un entier égal ou supérieur au nombre de threads qui seraient disponibles si une région parallèle sans num_threads ont été définies à ce stade dans le code. |
omp_get_thread_num | Retourne le numéro de thread du thread en cours d’exécution dans son équipe de threads. |
omp_get_num_procs | Retourne le nombre de processeurs disponibles lorsque la fonction est appelée. |
omp_in_parallel | Retourne une valeur différente de zéro si elle est appelée à partir d’une région parallèle. |
omp_set_dynamic | Indique que le nombre de threads disponibles dans les régions parallèles à venir peut être ajusté par l’heure d’exécution. |
omp_get_dynamic | Retourne une valeur qui indique si le nombre de threads disponibles dans les régions parallèles à venir peut être ajusté par l’heure d’exécution. |
omp_set_nested | Active le parallélisme imbriqué. |
omp_get_nested | Retourne une valeur qui indique si le parallélisme imbriqué est activé. |
Pour le verrou :
Fonction | Description |
---|---|
omp_init_lock | Initialise un verrou simple. |
omp_init_nest_lock | Initialise un verrou. |
omp_destroy_lock | Annule l’initialisation d’un verrou. |
omp_destroy_nest_lock | Annule l’initialisation d’un verrou imbriqué. |
omp_set_lock | Bloque l’exécution du thread jusqu’à ce qu’un verrou soit disponible. |
omp_set_nest_lock | Bloque l’exécution du thread jusqu’à ce qu’un verrou soit disponible. |
omp_unset_lock | Libère un verrou. |
omp_unset_nest_lock | Libère un verrou imbriqué. |
omp_test_lock | Tente de définir un verrou, mais ne bloque pas l’exécution du thread. |
omp_test_nest_lock | Tente de définir un verrou imbriqué, mais ne bloque pas l’exécution du thread. |
Type de données | Description |
---|---|
omp_lock_t |
Type qui contient l’état d’un verrou, que le verrou soit disponible ou si un thread possède un verrou. |
omp_nest_lock_t |
Type qui contient l’une des informations suivantes sur un verrou : indique si le verrou est disponible et l’identité du thread propriétaire du verrou et d’un nombre d’imbrications. |
Pour les routines de minutage :
Fonction | Description |
---|---|
omp_get_wtime | Retourne une valeur en secondes du temps écoulé à partir d’un point donné. |
omp_get_wtick | Retourne le nombre de secondes entre les cycles d’horloge du processeur. |
omp_destroy_lock
Annule l’initialisation d’un verrou.
void omp_destroy_lock(
omp_lock_t *lock
);
Paramètres
lock
Variable de type omp_lock_t
initialisée avec omp_init_lock.
Notes
Pour plus d’informations, consultez les fonctions omp_destroy_lock et omp_destroy_nest_lock 3.2.2.
Exemple
Consultez omp_init_lock pour obtenir un exemple d’utilisation omp_destroy_lock
.
omp_destroy_nest_lock
Annule l’initialisation d’un verrou imbriqué.
void omp_destroy_nest_lock(
omp_nest_lock_t *lock
);
Paramètres
lock
Variable de type omp_nest_lock_t
initialisée avec omp_init_nest_lock.
Notes
Pour plus d’informations, consultez les fonctions omp_destroy_lock et omp_destroy_nest_lock 3.2.2.
Exemple
Consultez omp_init_nest_lock pour obtenir un exemple d’utilisation omp_destroy_nest_lock
.
omp_get_dynamic
Retourne une valeur qui indique si le nombre de threads disponibles dans les régions parallèles à venir peut être ajusté par l’heure d’exécution.
int omp_get_dynamic();
Valeur retournée
Une valeur différente de zéro signifie que les threads sont ajustés dynamiquement.
Notes
L’ajustement dynamique des threads est spécifié avec omp_set_dynamic et OMP_DYNAMIC.
Pour plus d’informations, consultez la fonction omp_set_dynamic 3.1.7.
Exemple
Consultez omp_set_dynamic pour obtenir un exemple d’utilisation omp_get_dynamic
.
omp_get_max_threads
Retourne un entier égal ou supérieur au nombre de threads qui seraient disponibles si une région parallèle sans num_threads ont été définies à ce stade dans le code.
int omp_get_max_threads( )
Notes
Pour plus d’informations, consultez la fonction omp_get_max_threads 3.1.3.
Exemple
// omp_get_max_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_num_threads(8);
printf_s("%d\n", omp_get_max_threads( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_max_threads( ));
}
printf_s("%d\n", omp_get_max_threads( ));
#pragma omp parallel num_threads(3)
#pragma omp master
{
printf_s("%d\n", omp_get_max_threads( ));
}
printf_s("%d\n", omp_get_max_threads( ));
}
8
8
8
8
8
omp_get_nested
Retourne une valeur qui indique si le parallélisme imbriqué est activé.
int omp_get_nested( );
Valeur retournée
Une valeur différente de zéro signifie que le parallélisme imbriqué est activé.
Notes
Le parallélisme imbriqué est spécifié avec omp_set_nested et OMP_NESTED.
Pour plus d’informations, consultez la fonction omp_get_nested 3.1.10.
Exemple
Consultez omp_set_nested pour obtenir un exemple d’utilisation omp_get_nested
.
omp_get_num_procs
Retourne le nombre de processeurs disponibles lorsque la fonction est appelée.
int omp_get_num_procs();
Notes
Pour plus d’informations, consultez la fonction omp_get_num_procs 3.1.5.
Exemple
// omp_get_num_procs.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
printf_s("%d\n", omp_get_num_procs( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_num_procs( ));
}
}
// Expect the following output when the example is run on a two-processor machine:
2
2
omp_get_num_threads
Retourne le nombre de threads dans la région parallèle.
int omp_get_num_threads( );
Notes
Pour plus d’informations, consultez la fonction omp_get_num_threads 3.1.2.
Exemple
// omp_get_num_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(4);
printf_s("%d\n", omp_get_num_threads( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_num_threads( ));
}
printf_s("%d\n", omp_get_num_threads( ));
#pragma omp parallel num_threads(3)
#pragma omp master
{
printf_s("%d\n", omp_get_num_threads( ));
}
printf_s("%d\n", omp_get_num_threads( ));
}
1
4
1
3
1
omp_get_thread_num
Retourne le numéro de thread du thread en cours d’exécution dans son équipe de threads.
int omp_get_thread_num( );
Notes
Pour plus d’informations, consultez la fonction omp_get_thread_num 3.1.4.
Exemple
Consultez le parallèle pour obtenir un exemple d’utilisation omp_get_thread_num
.
omp_get_wtick
Retourne le nombre de secondes entre les cycles d’horloge du processeur.
double omp_get_wtick( );
Notes
Pour plus d’informations, consultez la fonction omp_get_wtick 3.3.2.
Exemple
Consultez omp_get_wtime pour obtenir un exemple d’utilisation omp_get_wtick
.
omp_get_wtime
Retourne une valeur en secondes du temps écoulé à partir d’un point donné.
double omp_get_wtime( );
Valeur retournée
Retourne une valeur en secondes du temps écoulé à partir d’un point arbitraire, mais cohérent.
Notes
Ce point restera cohérent pendant l’exécution du programme, ce qui rend possible les comparaisons à venir.
Pour plus d’informations, consultez la fonction omp_get_wtime 3.3.1.
Exemple
// omp_get_wtime.cpp
// compile with: /openmp
#include "omp.h"
#include <stdio.h>
#include <windows.h>
int main() {
double start = omp_get_wtime( );
Sleep(1000);
double end = omp_get_wtime( );
double wtick = omp_get_wtick( );
printf_s("start = %.16g\nend = %.16g\ndiff = %.16g\n",
start, end, end - start);
printf_s("wtick = %.16g\n1/wtick = %.16g\n",
wtick, 1.0 / wtick);
}
start = 594255.3671159324
end = 594256.3664474116
diff = 0.9993314791936427
wtick = 2.793651148400146e-007
1/wtick = 3579545
omp_in_parallel
Retourne une valeur différente de zéro si elle est appelée à partir d’une région parallèle.
int omp_in_parallel( );
Notes
Pour plus d’informations, consultez la fonction omp_in_parallel 3.1.6.
Exemple
// omp_in_parallel.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_num_threads(4);
printf_s("%d\n", omp_in_parallel( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_in_parallel( ));
}
}
0
1
omp_init_lock
Initialise un verrou simple.
void omp_init_lock(
omp_lock_t *lock
);
Paramètres
lock
Variable de type omp_lock_t
.
Notes
Pour plus d’informations, consultez les fonctions omp_init_lock et omp_init_nest_lock 3.2.1.
Exemple
// omp_init_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_lock_t my_lock;
int main() {
omp_init_lock(&my_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num( );
int i, j;
for (i = 0; i < 5; ++i) {
omp_set_lock(&my_lock);
printf_s("Thread %d - starting locked region\n", tid);
printf_s("Thread %d - ending locked region\n", tid);
omp_unset_lock(&my_lock);
}
}
omp_destroy_lock(&my_lock);
}
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
omp_init_nest_lock
Initialise un verrou.
void omp_init_nest_lock(
omp_nest_lock_t *lock
);
Paramètres
lock
Variable de type omp_nest_lock_t
.
Notes
Le nombre initial d’imbrication est égal à zéro.
Pour plus d’informations, consultez les fonctions omp_init_lock et omp_init_nest_lock 3.2.1.
Exemple
// omp_init_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_nest_lock_t my_lock;
void Test() {
int tid = omp_get_thread_num( );
omp_set_nest_lock(&my_lock);
printf_s("Thread %d - starting nested locked region\n", tid);
printf_s("Thread %d - ending nested locked region\n", tid);
omp_unset_nest_lock(&my_lock);
}
int main() {
omp_init_nest_lock(&my_lock);
#pragma omp parallel num_threads(4)
{
int i, j;
for (i = 0; i < 5; ++i) {
omp_set_nest_lock(&my_lock);
if (i % 3)
Test();
omp_unset_nest_lock(&my_lock);
}
}
omp_destroy_nest_lock(&my_lock);
}
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
omp_set_dynamic
Indique que le nombre de threads disponibles dans les régions parallèles à venir peut être ajusté par l’heure d’exécution.
void omp_set_dynamic(
int val
);
Paramètres
val
Valeur qui indique si le nombre de threads disponibles dans les régions parallèles à venir peut être ajusté par le runtime. Si ce n’est pas différent de zéro, le runtime peut ajuster le nombre de threads, le cas échéant, le runtime n’ajuste pas dynamiquement le nombre de threads.
Notes
Le nombre de threads ne dépasse jamais la valeur définie par omp_set_num_threads ou par OMP_NUM_THREADS.
Utilisez omp_get_dynamic pour afficher le paramètre actuel de omp_set_dynamic
.
Le paramètre pour omp_set_dynamic
lequel remplacera le paramètre de la variable d’environnement OMP_DYNAMIC.
Pour plus d’informations, consultez la fonction omp_set_dynamic 3.1.7.
Exemple
// omp_set_dynamic.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_dynamic(9);
omp_set_num_threads(4);
printf_s("%d\n", omp_get_dynamic( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_dynamic( ));
}
}
1
1
omp_set_lock
Bloque l’exécution du thread jusqu’à ce qu’un verrou soit disponible.
void omp_set_lock(
omp_lock_t *lock
);
Paramètres
lock
Variable de type omp_lock_t
initialisée avec omp_init_lock.
Notes
Pour plus d’informations, consultez les fonctions omp_set_lock et omp_set_nest_lock 3.2.3.
Exemples
Consultez omp_init_lock pour obtenir un exemple d’utilisation omp_set_lock
.
omp_set_nest_lock
Bloque l’exécution du thread jusqu’à ce qu’un verrou soit disponible.
void omp_set_nest_lock(
omp_nest_lock_t *lock
);
Paramètres
lock
Variable de type omp_nest_lock_t
initialisée avec omp_init_nest_lock.
Notes
Pour plus d’informations, consultez les fonctions omp_set_lock et omp_set_nest_lock 3.2.3.
Exemples
Consultez omp_init_nest_lock pour obtenir un exemple d’utilisation omp_set_nest_lock
.
omp_set_nested
Active le parallélisme imbriqué.
void omp_set_nested(
int val
);
Paramètres
val
Une valeur différente de zéro active le parallélisme imbriqué, tandis que zéro désactive le parallélisme imbriqué.
Notes
Le parallélisme imbriqué OMP peut être activé avec omp_set_nested
ou en définissant la variable d’environnement OMP_NESTED.
Le paramètre pour omp_set_nested
lequel remplacera le paramètre de la variable d’environnement OMP_NESTED
.
L’activation de la variable d’environnement peut interrompre un programme opérationnel autrement, car le nombre de threads augmente de façon exponentielle lors de l’imbrication de régions parallèles. Par exemple, une fonction qui récurse six fois avec le nombre de threads OMP définis sur 4 nécessite 4 096 (4 à la puissance de 6) threads. À l’exception des applications liées aux E/S, les performances d’une application se dégradent généralement s’il y a plus de threads que de processeurs.
Utilisez omp_get_nested pour afficher le paramètre actuel de omp_set_nested
.
Pour plus d’informations, consultez la fonction omp_set_nested 3.1.9.
Exemple
// omp_set_nested.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
int main( )
{
omp_set_nested(1);
omp_set_num_threads(4);
printf_s("%d\n", omp_get_nested( ));
#pragma omp parallel
#pragma omp master
{
printf_s("%d\n", omp_get_nested( ));
}
}
1
1
omp_set_num_threads
Définit le nombre de threads dans les régions parallèles à venir, sauf en cas de substitution par une clause num_threads .
void omp_set_num_threads(
int num_threads
);
Paramètres
num_threads
Nombre de threads dans la région parallèle.
Notes
Pour plus d’informations, consultez la fonction omp_set_num_threads 3.1.1.
Exemple
Consultez omp_get_num_threads pour obtenir un exemple d’utilisation omp_set_num_threads
.
omp_test_lock
Tente de définir un verrou, mais ne bloque pas l’exécution du thread.
int omp_test_lock(
omp_lock_t *lock
);
Paramètres
lock
Variable de type omp_lock_t
initialisée avec omp_init_lock.
Notes
Pour plus d’informations, consultez les fonctions 3.2.5 omp_test_lock et omp_test_nest_lock.
Exemple
// omp_test_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_lock_t simple_lock;
int main() {
omp_init_lock(&simple_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num();
while (!omp_test_lock(&simple_lock))
printf_s("Thread %d - failed to acquire simple_lock\n",
tid);
printf_s("Thread %d - acquired simple_lock\n", tid);
printf_s("Thread %d - released simple_lock\n", tid);
omp_unset_lock(&simple_lock);
}
omp_destroy_lock(&simple_lock);
}
Thread 1 - acquired simple_lock
Thread 1 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - acquired simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - acquired simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - released simple_lock
Thread 3 - failed to acquire simple_lock
Thread 3 - acquired simple_lock
Thread 3 - released simple_lock
omp_test_nest_lock
Tente de définir un verrou imbriqué, mais ne bloque pas l’exécution du thread.
int omp_test_nest_lock(
omp_nest_lock_t *lock
);
Paramètres
lock
Variable de type omp_nest_lock_t
initialisée avec omp_init_nest_lock.
Notes
Pour plus d’informations, consultez les fonctions 3.2.5 omp_test_lock et omp_test_nest_lock.
Exemple
// omp_test_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>
omp_nest_lock_t nestable_lock;
int main() {
omp_init_nest_lock(&nestable_lock);
#pragma omp parallel num_threads(4)
{
int tid = omp_get_thread_num();
while (!omp_test_nest_lock(&nestable_lock))
printf_s("Thread %d - failed to acquire nestable_lock\n",
tid);
printf_s("Thread %d - acquired nestable_lock\n", tid);
if (omp_test_nest_lock(&nestable_lock)) {
printf_s("Thread %d - acquired nestable_lock again\n",
tid);
printf_s("Thread %d - released nestable_lock\n",
tid);
omp_unset_nest_lock(&nestable_lock);
}
printf_s("Thread %d - released nestable_lock\n", tid);
omp_unset_nest_lock(&nestable_lock);
}
omp_destroy_nest_lock(&nestable_lock);
}
Thread 1 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock again
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - acquired nestable_lock
Thread 2 - acquired nestable_lock again
Thread 2 - released nestable_lock
Thread 2 - released nestable_lock
omp_unset_lock
Libère un verrou.
void omp_unset_lock(
omp_lock_t *lock
);
Paramètres
lock
Variable de type omp_lock_t
initialisée avec omp_init_lock, appartenant au thread et en cours d’exécution dans la fonction.
Notes
Pour plus d’informations, consultez les fonctions omp_unset_lock et omp_unset_nest_lock 3.2.4.
Exemple
Consultez omp_init_lock pour obtenir un exemple d’utilisation omp_unset_lock
.
omp_unset_nest_lock
Libère un verrou imbriqué.
void omp_unset_nest_lock(
omp_nest_lock_t *lock
);
Paramètres
lock
Variable de type omp_nest_lock_t
initialisée avec omp_init_nest_lock, appartenant au thread et en cours d’exécution dans la fonction.
Notes
Pour plus d’informations, consultez les fonctions omp_unset_lock et omp_unset_nest_lock 3.2.4.
Exemple
Consultez omp_init_nest_lock pour obtenir un exemple d’utilisation omp_unset_nest_lock
.