Sdílet prostřednictvím


Funkce jazyka OpenMP

Poskytuje odkazy na funkce používané v rozhraní OpenMP API.

Implementace standardu OpenMP v jazyce Visual C++ zahrnuje následující funkce a datové typy.

Pro spouštění prostředí:

Function Popis
omp_set_num_threads Nastaví počet vláken v nadcházejících paralelních oblastech, pokud je nepřepíše klauzule num_threads .
omp_get_num_threads Vrátí počet vláken v paralelní oblasti.
omp_get_max_threads Vrátí celé číslo, které je rovno nebo větší než počet vláken, která by byla k dispozici, pokud by byla v tomto okamžiku v kódu definována paralelní oblast bez num_threads .
omp_get_thread_num Vrátí číslo vlákna spuštěného v rámci týmu vlákna.
omp_get_num_procs Vrátí počet procesorů, které jsou k dispozici při zavolání funkce.
omp_in_parallel Vrátí nenulovou hodnotu, pokud je volána z paralelní oblasti.
omp_set_dynamic Označuje, že počet vláken dostupných v nadcházejících paralelních oblastech je možné upravit podle doby běhu.
omp_get_dynamic Vrátí hodnotu, která označuje, jestli je možné upravit počet vláken dostupných v nadcházejících paralelních oblastech podle doby běhu.
omp_set_nested Povolí vnořený paralelismus.
omp_get_nested Vrátí hodnotu, která označuje, jestli je povolen vnořený paralelismus.

Zámek:

Function Popis
omp_init_lock Inicializuje jednoduchý zámek.
omp_init_nest_lock Inicializuje zámek.
omp_destroy_lock Neinicializuje zámek.
omp_destroy_nest_lock Neinicializuje vnořený zámek.
omp_set_lock Blokuje provádění vlákna, dokud není k dispozici zámek.
omp_set_nest_lock Blokuje provádění vlákna, dokud není k dispozici zámek.
omp_unset_lock Uvolní zámek.
omp_unset_nest_lock Uvolní vnořený zámek.
omp_test_lock Pokusí se nastavit zámek, ale neblokuje provádění vlákna.
omp_test_nest_lock Pokusí se nastavit vnořitelný zámek, ale neblokuje provádění vlákna.
Datový typ Popis
omp_lock_t Typ, který obsahuje stav zámku, ať už je zámek dostupný nebo jestli vlákno vlastní zámek.
omp_nest_lock_t Typ, který obsahuje jeden z následujících informací o zámku: jestli je zámek dostupný, a identitu vlákna, které vlastní zámek, a počet vnořování.

Pro rutiny časování:

Function Popis
omp_get_wtime Vrátí hodnotu v sekundách uplynulého času z nějakého bodu.
omp_get_wtick Vrátí počet sekund mezi hodinami procesoru.

omp_destroy_lock

Neinicializuje zámek.

void omp_destroy_lock(
   omp_lock_t *lock
);

Parametry

lock
Proměnná typu omp_lock_t , která byla inicializována pomocí omp_init_lock.

Poznámky

Další informace najdete v tématu 3.2.2 omp_destroy_lock a omp_destroy_nest_lock funkce.

Příklad

Příklad použití omp_destroy_locknajdete v omp_init_lock .

omp_destroy_nest_lock

Neinicializuje vnořený zámek.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Parametry

lock
Proměnná typu omp_nest_lock_t , která byla inicializována pomocí omp_init_nest_lock.

Poznámky

Další informace najdete v tématu 3.2.2 omp_destroy_lock a omp_destroy_nest_lock funkce.

Příklad

Příklad použití omp_destroy_nest_locknajdete v omp_init_nest_lock .

omp_get_dynamic

Vrátí hodnotu, která označuje, jestli je možné upravit počet vláken dostupných v nadcházejících paralelních oblastech podle doby běhu.

int omp_get_dynamic();

Vrácená hodnota

Nenulová hodnota znamená, že vlákna budou dynamicky upravena.

Poznámky

Dynamické úpravy vláken se zadává pomocí omp_set_dynamic a OMP_DYNAMIC.

Další informace najdete v tématu 3.1.7 omp_set_dynamic funkce.

Příklad

Příklad použití omp_get_dynamicnajdete v omp_set_dynamic .

omp_get_max_threads

Vrátí celé číslo, které je rovno nebo větší než počet vláken, která by byla k dispozici, pokud by byla v tomto okamžiku v kódu definována paralelní oblast bez num_threads .

int omp_get_max_threads( )

Poznámky

Další informace naleznete v tématu 3.1.3 omp_get_max_threads funkce.

Příklad

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

Vrátí hodnotu, která označuje, jestli je povolen vnořený paralelismus.

int omp_get_nested( );

Vrácená hodnota

Nenulová hodnota znamená, že je povolen vnořený paralelismus.

Poznámky

Vnořený paralelismus se zadává pomocí omp_set_nested a OMP_NESTED.

Další informace najdete v tématu 3.1.10 omp_get_nested funkce.

Příklad

Příklad použití omp_get_nestednajdete v omp_set_nested .

omp_get_num_procs

Vrátí počet procesorů, které jsou k dispozici při zavolání funkce.

int omp_get_num_procs();

Poznámky

Další informace najdete v tématu 3.1.5 omp_get_num_procs funkce.

Příklad

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

Vrátí počet vláken v paralelní oblasti.

int omp_get_num_threads( );

Poznámky

Další informace najdete v tématu 3.1.2 omp_get_num_threads funkce.

Příklad

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

Vrátí číslo vlákna spuštěného v rámci týmu vlákna.

int omp_get_thread_num( );

Poznámky

Další informace najdete v tématu 3.1.4 omp_get_thread_num funkce.

Příklad

Viz paralelně příklad použití omp_get_thread_num.

omp_get_wtick

Vrátí počet sekund mezi hodinami procesoru.

double omp_get_wtick( );

Poznámky

Další informace najdete v tématu 3.3.2 omp_get_wtick funkce.

Příklad

Příklad použití omp_get_wticknajdete v omp_get_wtime .

omp_get_wtime

Vrátí hodnotu v sekundách uplynulého času z nějakého bodu.

double omp_get_wtime( );

Vrácená hodnota

Vrátí hodnotu v sekundách uplynulého času z nějakého libovolného, ale konzistentního bodu.

Poznámky

Tento bod zůstane během provádění programu konzistentní, takže bude možné nadcházející porovnání.

Další informace najdete v tématu 3.3.1 omp_get_wtime funkce.

Příklad

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

Vrátí nenulovou hodnotu, pokud je volána z paralelní oblasti.

int omp_in_parallel( );

Poznámky

Další informace najdete v tématu 3.1.6 omp_in_parallel funkce.

Příklad

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

Inicializuje jednoduchý zámek.

void omp_init_lock(
   omp_lock_t *lock
);

Parametry

lock
Proměnná typu omp_lock_t.

Poznámky

Další informace najdete v článcích 3.2.1 omp_init_lock a omp_init_nest_lock funkcí.

Příklad

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

Inicializuje zámek.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Parametry

lock
Proměnná typu omp_nest_lock_t.

Poznámky

Počáteční počet vnoření je nula.

Další informace najdete v článcích 3.2.1 omp_init_lock a omp_init_nest_lock funkcí.

Příklad

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

Označuje, že počet vláken dostupných v nadcházejících paralelních oblastech je možné upravit podle doby běhu.

void omp_set_dynamic(
   int val
);

Parametry

Val
Hodnota, která označuje, jestli je možné upravit počet vláken dostupných v nadcházejících paralelních oblastech modulem runtime. Pokud nenulový, modul runtime může upravit počet vláken, pokud je nula, modul runtime dynamicky neupraví počet vláken.

Poznámky

Počet vláken nikdy nepřekročí hodnotu nastavenou omp_set_num_threads nebo OMP_NUM_THREADS.

K zobrazení aktuálního omp_set_dynamicnastavení použijte omp_get_dynamic .

Nastavení pro omp_set_dynamic přepíše nastavení proměnné prostředí OMP_DYNAMIC .

Další informace najdete v tématu 3.1.7 omp_set_dynamic funkce.

Příklad

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

Blokuje provádění vlákna, dokud není k dispozici zámek.

void omp_set_lock(
   omp_lock_t *lock
);

Parametry

lock
Proměnná typu omp_lock_t , která byla inicializována pomocí omp_init_lock.

Poznámky

Další informace najdete v tématu 3.2.3 omp_set_lock a omp_set_nest_lock funkce.

Příklady

Příklad použití omp_set_locknajdete v omp_init_lock .

omp_set_nest_lock

Blokuje provádění vlákna, dokud není k dispozici zámek.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Parametry

lock
Proměnná typu omp_nest_lock_t , která byla inicializována pomocí omp_init_nest_lock.

Poznámky

Další informace najdete v tématu 3.2.3 omp_set_lock a omp_set_nest_lock funkce.

Příklady

Příklad použití omp_set_nest_locknajdete v omp_init_nest_lock .

omp_set_nested

Povolí vnořený paralelismus.

void omp_set_nested(
   int val
);

Parametry

Val
Nenulová hodnota umožňuje vnořený paralelismus, zatímco nula zakáže vnořený paralelismus.

Poznámky

Vnořený paralelismus OMP lze zapnout pomocí omp_set_nestednebo nastavením proměnné prostředí OMP_NESTED .

Nastavení pro omp_set_nested přepíše nastavení OMP_NESTED proměnné prostředí.

Povolení proměnné prostředí může přerušit jinak provozní program, protože počet vláken se při vnoření paralelních oblastí exponenciálně zvýší. Například funkce, která opakuje šestkrát s počtem vláken OMP nastaveným na 4, vyžaduje 4 096 (4 až 6) vláken. S výjimkou vstupně-výstupních aplikací se výkon aplikace obecně snižuje, pokud existuje více vláken než procesorů.

K zobrazení aktuálního omp_set_nestednastavení použijte omp_get_nested .

Další informace naleznete v tématu 3.1.9 omp_set_nested funkce.

Příklad

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

Nastaví počet vláken v nadcházejících paralelních oblastech, pokud je nepřepíše klauzule num_threads .

void omp_set_num_threads(
   int num_threads
);

Parametry

num_threads
Počet vláken v paralelní oblasti

Poznámky

Další informace najdete v tématu 3.1.1 omp_set_num_threads funkce.

Příklad

Příklad použití omp_set_num_threadsnajdete v omp_get_num_threads .

omp_test_lock

Pokusí se nastavit zámek, ale neblokuje provádění vlákna.

int omp_test_lock(
   omp_lock_t *lock
);

Parametry

lock
Proměnná typu omp_lock_t , která byla inicializována pomocí omp_init_lock.

Poznámky

Další informace najdete v článcích 3.2.5 omp_test_lock a omp_test_nest_lock funkcí.

Příklad

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

Pokusí se nastavit vnořitelný zámek, ale neblokuje provádění vlákna.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Parametry

lock
Proměnná typu omp_nest_lock_t , která byla inicializována pomocí omp_init_nest_lock.

Poznámky

Další informace najdete v článcích 3.2.5 omp_test_lock a omp_test_nest_lock funkcí.

Příklad

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

Uvolní zámek.

void omp_unset_lock(
   omp_lock_t *lock
);

Parametry

lock
Proměnná typu omp_lock_t inicializovaného pomocí omp_init_lock vlastněná vláknem a spuštěním ve funkci.

Poznámky

Další informace naleznete v tématu 3.2.4 omp_unset_lock a omp_unset_nest_lock funkce.

Příklad

Příklad použití omp_unset_locknajdete v omp_init_lock .

omp_unset_nest_lock

Uvolní vnořený zámek.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Parametry

lock
Proměnná typu omp_nest_lock_t inicializovaného pomocí omp_init_nest_lock vlastněná vláknem a prováděním ve funkci.

Poznámky

Další informace naleznete v tématu 3.2.4 omp_unset_lock a omp_unset_nest_lock funkce.

Příklad

Příklad použití omp_unset_nest_locknajdete v omp_init_nest_lock .