Share via


OpenMP-functies

Bevat koppelingen naar functies die worden gebruikt in de OpenMP-API.

De Visual C++-implementatie van de OpenMP-standaard bevat de volgende functies en gegevenstypen.

Voor de uitvoering van de omgeving:

Functie Description
omp_set_num_threads Stelt het aantal threads in voor aankomende parallelle gebieden, tenzij dit wordt overschreven door een num_threads-clausule.
omp_get_num_threads Retourneert het aantal threads in de parallelle regio.
omp_get_max_threads Retourneert een geheel getal dat gelijk is aan of groter is dan het aantal threads dat beschikbaar zou zijn als een parallelle regio zonder num_threads op dat punt in de code is gedefinieerd.
omp_get_thread_num Retourneert het threadnummer van de thread die actief is in zijn threadteam.
omp_get_num_procs Retourneert het aantal processors dat beschikbaar is wanneer de functie wordt aangeroepen.
omp_in_parallel Retourneert niet-nul indien aangeroepen vanuit een parallelle regio.
omp_set_dynamic Geeft aan dat het aantal threads dat beschikbaar is in toekomstige parallelle regio's, kan worden aangepast door de runtime.
omp_get_dynamic Retourneert een waarde die aangeeft of het aantal threads dat beschikbaar is in toekomstige parallelle regio's, kan worden aangepast door de runtime.
omp_set_nested Hiermee schakelt u geneste parallelle uitvoering in.
omp_get_nested Retourneert een waarde die aangeeft of geneste parallelisme is ingeschakeld.

Voor vergrendeling:

Functie Description
omp_init_lock Initialiseert een eenvoudige vergrendeling.
omp_init_nest_lock Initialiseert een vergrendeling.
omp_destroy_lock Maakt een vergrendeling ongedaan.
omp_destroy_nest_lock Maakt de initialisatie van een nestbare vergrendeling ongedaan.
omp_set_lock Hiermee blokkeert u de uitvoering van threads totdat er een vergrendeling beschikbaar is.
omp_set_nest_lock Hiermee blokkeert u de uitvoering van threads totdat er een vergrendeling beschikbaar is.
omp_unset_lock Hiermee wordt een vergrendeling vrijgegeven.
omp_unset_nest_lock Ontgrendelt een nestbare vergrendeling.
omp_test_lock Hiermee wordt geprobeerd een vergrendeling in te stellen, maar wordt de uitvoering van threads niet geblokkeerd.
omp_test_nest_lock Probeert een nestbare vergrendeling te zetten, maar blokkeert de uitvoering van de thread niet.
Gegevenstype Description
omp_lock_t Een type dat de status van een vergrendeling bevat, ongeacht of de vergrendeling beschikbaar is of dat een thread eigenaar is van een vergrendeling.
omp_nest_lock_t Een type dat een van de volgende stukjes informatie over een vergrendeling bevat: of de vergrendeling beschikbaar is, de identiteit van de thread die de vergrendeling bezit, en het nestaantal van de vergrendeling.

Voor tijdsroutines:

Functie Description
omp_get_wtime Retourneert een waarde in seconden van de tijd die vanaf een bepaald punt is verstreken.
omp_get_wtick Retourneert het aantal seconden tussen de klokklokken van de processor.

omp_destroy_lock

Maakt een vergrendeling ongedaan.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_lock_t dat is geïnitialiseerd met omp_init_lock.

Opmerkingen

Zie 3.2.2 omp_destroy_lock en omp_destroy_nest_lock functies voor meer informatie.

Example

Zie omp_init_lock voor een voorbeeld van het gebruik omp_destroy_lock.

omp_destroy_nest_lock

Maakt de initialisatie van een nestbare vergrendeling ongedaan.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_nest_lock_t dat met omp_init_nest_lock is geïnitialiseerd.

Opmerkingen

Zie 3.2.2 omp_destroy_lock en omp_destroy_nest_lock functies voor meer informatie.

Example

Zie omp_init_nest_lock voor een voorbeeld van het gebruik omp_destroy_nest_lock.

omp_get_dynamic

Retourneert een waarde die aangeeft of het aantal threads dat beschikbaar is in toekomstige parallelle regio's, kan worden aangepast door de runtime.

int omp_get_dynamic();

Retourwaarde

Een niet-nulwaarde betekent dat threads dynamisch worden aangepast.

Opmerkingen

Dynamische aanpassing van threads wordt opgegeven met omp_set_dynamic en OMP_DYNAMIC.

Zie 3.1.7 omp_set_dynamic functie voor meer informatie.

Example

Zie omp_set_dynamic voor een voorbeeld van het gebruik omp_get_dynamic.

omp_get_max_threads

Retourneert een geheel getal dat gelijk is aan of groter is dan het aantal threads dat beschikbaar zou zijn als een parallelle regio zonder num_threads op dat punt in de code is gedefinieerd.

int omp_get_max_threads( )

Opmerkingen

Zie 3.1.3 omp_get_max_threads functie voor meer informatie.

Example

// 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

Retourneert een waarde die aangeeft of geneste parallelisme is ingeschakeld.

int omp_get_nested( );

Retourwaarde

Een waarde die niet nul is, betekent dat geneste parallellisme is ingeschakeld.

Opmerkingen

Geneste parallelle uitvoering wordt opgegeven met omp_set_nested en OMP_NESTED.

Zie 3.1.10 omp_get_nested functie voor meer informatie.

Example

Zie omp_set_nested voor een voorbeeld van het gebruik omp_get_nested.

omp_get_num_procs

Retourneert het aantal processors dat beschikbaar is wanneer de functie wordt aangeroepen.

int omp_get_num_procs();

Opmerkingen

Zie 3.1.5 omp_get_num_procs functie voor meer informatie.

Example

// 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 (geeft het aantal threads terug)

Retourneert het aantal threads in de parallelle regio.

int omp_get_num_threads( );

Opmerkingen

Zie 3.1.2 omp_get_num_threads functie voor meer informatie.

Example

// 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

Retourneert het threadnummer van de thread die actief is in zijn threadteam.

int omp_get_thread_num( );

Opmerkingen

Zie 3.1.4 omp_get_thread_num functie voor meer informatie.

Example

Zie parallel voor een voorbeeld van het gebruik omp_get_thread_num.

omp_get_wtick

Retourneert het aantal seconden tussen de klokklokken van de processor.

double omp_get_wtick( );

Opmerkingen

Zie 3.3.2 omp_get_wtick functie voor meer informatie.

Example

Zie omp_get_wtime voor een voorbeeld van het gebruik omp_get_wtick.

omp_get_wtime

Retourneert een waarde in seconden van de tijd die vanaf een bepaald punt is verstreken.

double omp_get_wtime( );

Retourwaarde

Retourneert een waarde in seconden van de tijd die is verstreken van een willekeurig, maar consistent punt.

Opmerkingen

Dat punt blijft consistent tijdens de uitvoering van het programma, waardoor toekomstige vergelijkingen mogelijk zijn.

Zie 3.3.1 omp_get_wtime functie voor meer informatie.

Example

// 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

Retourneert niet-nul indien aangeroepen vanuit een parallelle regio.

int omp_in_parallel( );

Opmerkingen

Zie 3.1.6 omp_in_parallel functie voor meer informatie.

Example

// 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

Initialiseert een eenvoudige vergrendeling.

void omp_init_lock(
   omp_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_lock_t.

Opmerkingen

Zie 3.2.1 omp_init_lock en omp_init_nest_lock functies voor meer informatie.

Example

// 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

Initialiseert een vergrendeling.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_nest_lock_t.

Opmerkingen

Het eerste aantal nesten is nul.

Zie 3.2.1 omp_init_lock en omp_init_nest_lock functies voor meer informatie.

Example

// 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

Geeft aan dat het aantal threads dat beschikbaar is in toekomstige parallelle regio's, kan worden aangepast door de runtime.

void omp_set_dynamic(
   int val
);

Parameterwaarden

val
Een waarde die aangeeft of het aantal threads dat beschikbaar is in toekomstige parallelle regio's, kan worden aangepast door de runtime. Als het niet-nul is, kan de runtime het aantal threads aanpassen, als nul, de runtime het aantal threads niet dynamisch aanpast.

Opmerkingen

Het aantal threads overschrijdt nooit de waarde die is ingesteld door omp_set_num_threads of OMP_NUM_THREADS.

Gebruik omp_get_dynamic om de huidige instelling van omp_set_dynamic weer te geven.

De instelling voor omp_set_dynamic overschrijft de instelling van de omgevingsvariabele OMP_DYNAMIC.

Zie 3.1.7 omp_set_dynamic functie voor meer informatie.

Example

// 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

Hiermee blokkeert u de uitvoering van threads totdat er een vergrendeling beschikbaar is.

void omp_set_lock(
   omp_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_lock_t dat is geïnitialiseerd met omp_init_lock.

Opmerkingen

Zie de functies 3.2.3 omp_set_lock en omp_set_nest_lock voor meer informatie.

Voorbeelden

Zie omp_init_lock voor een voorbeeld van het gebruik omp_set_lock.

omp_set_nest_lock

Hiermee blokkeert u de uitvoering van threads totdat er een vergrendeling beschikbaar is.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_nest_lock_t dat met omp_init_nest_lock is geïnitialiseerd.

Opmerkingen

Zie de functies 3.2.3 omp_set_lock en omp_set_nest_lock voor meer informatie.

Voorbeelden

Zie omp_init_nest_lock voor een voorbeeld van het gebruik omp_set_nest_lock.

omp_set_nested

Hiermee schakelt u geneste parallelle uitvoering in.

void omp_set_nested(
   int val
);

Parameterwaarden

val
Een niet-nulwaarde maakt geneste parallelle processen mogelijk, terwijl nul geneste parallelle processen uitschakelt.

Opmerkingen

Genest OMP-parallelisme kan worden ingeschakeld met omp_set_nested of door de omgevingsvariabele OMP_NESTED in te stellen.

De instelling voor omp_set_nested overschrijft de instelling van de omgevingsvariabele OMP_NESTED.

Het inschakelen van de omgevingsvariabele kan een ander operationeel programma verbreken, omdat het aantal threads exponentieel toeneemt bij het nesten van parallelle regio's. Een functie die zes keer wordt herhaald met het aantal OMP-threads dat is ingesteld op 4, vereist bijvoorbeeld 4.096 (4 tot de macht van 6) threads. Met uitzondering van I/O-gebonden toepassingen, worden de prestaties van een toepassing over het algemeen verslechterd als er meer threads zijn dan processors.

Gebruik omp_get_nested om de huidige instelling van omp_set_nested te tonen.

Voor meer informatie, zie 3.1.9 omp_set_nested functie.

Example

// 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

Stelt het aantal threads in voor aankomende parallelle gebieden, tenzij dit wordt overschreven door een num_threads-clausule.

void omp_set_num_threads(
   int num_threads
);

Parameterwaarden

num_threads
Het aantal threads in de parallelle regio.

Opmerkingen

Zie 3.1.1 omp_set_num_threads functie voor meer informatie.

Example

Zie omp_get_num_threads voor een voorbeeld van het gebruik omp_set_num_threads.

omp_test_lock

Hiermee wordt geprobeerd een vergrendeling in te stellen, maar wordt de uitvoering van threads niet geblokkeerd.

int omp_test_lock(
   omp_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_lock_t dat is geïnitialiseerd met omp_init_lock.

Opmerkingen

Zie de functies 3.2.5 omp_test_lock en omp_test_nest_lock voor meer informatie.

Example

// 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

Probeert een nestbare vergrendeling te zetten, maar blokkeert de uitvoering van de thread niet.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_nest_lock_t dat met omp_init_nest_lock is geïnitialiseerd.

Opmerkingen

Zie de functies 3.2.5 omp_test_lock en omp_test_nest_lock voor meer informatie.

Example

// 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

Hiermee wordt een vergrendeling vrijgegeven.

void omp_unset_lock(
   omp_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_lock_t dat is geïnitialiseerd met omp_init_lock, die eigendom is van de thread en die wordt uitgevoerd in de functie.

Opmerkingen

Zie de functies 3.2.4 omp_unset_lock en omp_unset_nest_lock voor meer informatie.

Example

Zie omp_init_lock voor een voorbeeld van het gebruik omp_unset_lock.

omp_unset_nest_lock

Ontgrendelt een nestbare vergrendeling.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parameterwaarden

vergrendeling
Een variabele van het type omp_nest_lock_t dat is geïnitialiseerd met omp_init_nest_lock, die eigendom is van de thread en die wordt uitgevoerd in de functie.

Opmerkingen

Zie de functies 3.2.4 omp_unset_lock en omp_unset_nest_lock voor meer informatie.

Example

Zie omp_init_nest_lock voor een voorbeeld van het gebruik omp_unset_nest_lock.