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_lock
najdete 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_lock
najdete 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_dynamic
najdete 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_nested
najdete 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_wtick
najdete 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_dynamic
nastavení 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_lock
najdete 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_lock
najdete 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_nested
nebo 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_nested
nastavení 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_threads
najdete 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_lock
najdete 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_lock
najdete v omp_init_nest_lock .