Partager via


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_nestedou 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.