OpenMP — Funkcje
Udostępnia linki do funkcji używanych w interfejsie API openMP.
Implementacja języka Visual C++ standardu OpenMP obejmuje następujące funkcje i typy danych.
W przypadku wykonywania środowiska:
Function | opis |
---|---|
omp_set_num_threads | Ustawia liczbę wątków w nadchodzących regionach równoległych, chyba że zostanie zastąpiona przez klauzulę num_threads . |
omp_get_num_threads | Zwraca liczbę wątków w regionie równoległym. |
omp_get_max_threads | Zwraca liczbę całkowitą równą lub większą niż liczba wątków, które byłyby dostępne, jeśli region równoległy bez num_threads został zdefiniowany w tym momencie w kodzie. |
omp_get_thread_num | Zwraca numer wątku wątku wykonywanego w zespole wątków. |
omp_get_num_procs | Zwraca liczbę procesorów, które są dostępne po wywołaniu funkcji. |
omp_in_parallel | Zwraca wartość niezerową, jeśli jest wywoływana z regionu równoległego. |
omp_set_dynamic | Wskazuje, że liczba wątków dostępnych w nadchodzących regionach równoległych może być dostosowywana przez czas wykonywania. |
omp_get_dynamic | Zwraca wartość, która wskazuje, czy liczba wątków dostępnych w nadchodzących regionach równoległych może być dostosowywana przez czas wykonywania. |
omp_set_nested | Umożliwia zagnieżdżone równoległość. |
omp_get_nested | Zwraca wartość wskazującą, czy zagnieżdżona równoległość jest włączona. |
W przypadku blokady:
Function | opis |
---|---|
omp_init_lock | Inicjuje prostą blokadę. |
omp_init_nest_lock | Inicjuje blokadę. |
omp_destroy_lock | Uninitializuje blokadę. |
omp_destroy_nest_lock | Uninitializuje zagnieżdżalną blokadę. |
omp_set_lock | Blokuje wykonywanie wątku do momentu udostępnienia blokady. |
omp_set_nest_lock | Blokuje wykonywanie wątku do momentu udostępnienia blokady. |
omp_unset_lock | Zwalnia blokadę. |
omp_unset_nest_lock | Zwalnia blokadę zagnieżdżalną. |
omp_test_lock | Próbuje ustawić blokadę, ale nie blokuje wykonywania wątku. |
omp_test_nest_lock | Próbuje ustawić blokadę zagnieżdżalną, ale nie blokuje wykonywania wątku. |
Typ danych | opis |
---|---|
omp_lock_t |
Typ, który przechowuje stan blokady, niezależnie od tego, czy blokada jest dostępna, czy wątek jest właścicielem blokady. |
omp_nest_lock_t |
Typ, który zawiera jedną z następujących informacji o blokadzie: czy blokada jest dostępna, oraz tożsamość wątku, który jest właścicielem blokady i liczby zagnieżdżania. |
W przypadku procedur chronometrażu:
Function | opis |
---|---|
omp_get_wtime | Zwraca wartość w sekundach czasu, który upłynął od pewnego momentu. |
omp_get_wtick | Zwraca liczbę sekund między znacznikami zegara procesora. |
omp_destroy_lock
Uninitializuje blokadę.
void omp_destroy_lock(
omp_lock_t *lock
);
Parametry
lock
Zmienna typu omp_lock_t
zainicjowana przy użyciu omp_init_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_destroy_lock 3.2.2 i omp_destroy_nest_lock.
Przykład
Zobacz omp_init_lock , aby zapoznać się z przykładem użycia elementu omp_destroy_lock
.
omp_destroy_nest_lock
Uninitializuje zagnieżdżalną blokadę.
void omp_destroy_nest_lock(
omp_nest_lock_t *lock
);
Parametry
lock
Zmienna typu omp_nest_lock_t
zainicjowana przy użyciu omp_init_nest_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_destroy_lock 3.2.2 i omp_destroy_nest_lock.
Przykład
Zobacz omp_init_nest_lock , aby zapoznać się z przykładem użycia elementu omp_destroy_nest_lock
.
omp_get_dynamic
Zwraca wartość, która wskazuje, czy liczba wątków dostępnych w nadchodzących regionach równoległych może być dostosowywana przez czas wykonywania.
int omp_get_dynamic();
Wartość zwracana
Wartość niezerowa oznacza, że wątki będą dynamicznie dostosowywane.
Uwagi
Dynamiczne dostosowanie wątków jest określane przy użyciu omp_set_dynamic i OMP_DYNAMIC.
Aby uzyskać więcej informacji, zobacz funkcja omp_set_dynamic 3.1.7.
Przykład
Zobacz omp_set_dynamic , aby zapoznać się z przykładem użycia elementu omp_get_dynamic
.
omp_get_max_threads
Zwraca liczbę całkowitą równą lub większą niż liczba wątków, które byłyby dostępne, jeśli region równoległy bez num_threads został zdefiniowany w tym momencie w kodzie.
int omp_get_max_threads( )
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_get_max_threads 3.1.3.
Przykład
// 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
Zwraca wartość wskazującą, czy zagnieżdżona równoległość jest włączona.
int omp_get_nested( );
Wartość zwracana
Wartość niezerowa oznacza, że zagnieżdżona równoległość jest włączona.
Uwagi
Równoległość zagnieżdżona jest określana przy użyciu omp_set_nested i OMP_NESTED.
Aby uzyskać więcej informacji, zobacz funkcja omp_get_nested 3.1.10.
Przykład
Zobacz omp_set_nested , aby zapoznać się z przykładem użycia elementu omp_get_nested
.
omp_get_num_procs
Zwraca liczbę procesorów, które są dostępne po wywołaniu funkcji.
int omp_get_num_procs();
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_get_num_procs 3.1.5.
Przykład
// 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
Zwraca liczbę wątków w regionie równoległym.
int omp_get_num_threads( );
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_get_num_threads 3.1.2.
Przykład
// 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
Zwraca numer wątku wątku wykonywanego w zespole wątków.
int omp_get_thread_num( );
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_get_thread_num 3.1.4.
Przykład
Zobacz równoległe , aby zapoznać się z przykładem użycia elementu omp_get_thread_num
.
omp_get_wtick
Zwraca liczbę sekund między znacznikami zegara procesora.
double omp_get_wtick( );
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja 3.3.2 omp_get_wtick.
Przykład
Zobacz omp_get_wtime , aby zapoznać się z przykładem użycia elementu omp_get_wtick
.
omp_get_wtime
Zwraca wartość w sekundach czasu, który upłynął od pewnego momentu.
double omp_get_wtime( );
Wartość zwracana
Zwraca wartość w sekundach czasu, który upłynął z dowolnego, ale spójnego punktu.
Uwagi
Ten punkt pozostanie spójny podczas wykonywania programu, dzięki czemu możliwe będzie nadchodzące porównania.
Aby uzyskać więcej informacji, zobacz funkcja omp_get_wtime 3.3.1.
Przykład
// 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
Zwraca wartość niezerową, jeśli jest wywoływana z regionu równoległego.
int omp_in_parallel( );
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_in_parallel 3.1.6.
Przykład
// 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
Inicjuje prostą blokadę.
void omp_init_lock(
omp_lock_t *lock
);
Parametry
lock
Zmienna typu omp_lock_t
.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_init_lock 3.2.1 i omp_init_nest_lock.
Przykład
// 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
Inicjuje blokadę.
void omp_init_nest_lock(
omp_nest_lock_t *lock
);
Parametry
lock
Zmienna typu omp_nest_lock_t
.
Uwagi
Początkowa liczba zagnieżdżeń wynosi zero.
Aby uzyskać więcej informacji, zobacz funkcje omp_init_lock 3.2.1 i omp_init_nest_lock.
Przykład
// 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
Wskazuje, że liczba wątków dostępnych w nadchodzących regionach równoległych może być dostosowywana przez czas wykonywania.
void omp_set_dynamic(
int val
);
Parametry
Val
Wartość wskazująca, czy liczba wątków dostępnych w nadchodzących regionach równoległych może zostać skorygowana przez środowisko uruchomieniowe. Jeśli niezerowa, środowisko uruchomieniowe może dostosować liczbę wątków, jeśli zero, środowisko uruchomieniowe nie będzie dynamicznie dostosowywać liczby wątków.
Uwagi
Liczba wątków nigdy nie przekroczy wartości ustawionej przez omp_set_num_threads lub OMP_NUM_THREADS.
Użyj omp_get_dynamic, aby wyświetlić bieżące ustawienie .omp_set_dynamic
Ustawienie parametru spowoduje omp_set_dynamic
zastąpienie ustawienia zmiennej środowiskowej OMP_DYNAMIC .
Aby uzyskać więcej informacji, zobacz funkcja omp_set_dynamic 3.1.7.
Przykład
// 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 wykonywanie wątku do momentu udostępnienia blokady.
void omp_set_lock(
omp_lock_t *lock
);
Parametry
lock
Zmienna typu omp_lock_t
zainicjowana przy użyciu omp_init_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_set_lock 3.2.3 i omp_set_nest_lock.
Przykłady
Zobacz omp_init_lock , aby zapoznać się z przykładem użycia elementu omp_set_lock
.
omp_set_nest_lock
Blokuje wykonywanie wątku do momentu udostępnienia blokady.
void omp_set_nest_lock(
omp_nest_lock_t *lock
);
Parametry
lock
Zmienna typu omp_nest_lock_t
zainicjowana przy użyciu omp_init_nest_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_set_lock 3.2.3 i omp_set_nest_lock.
Przykłady
Zobacz omp_init_nest_lock , aby zapoznać się z przykładem użycia elementu omp_set_nest_lock
.
omp_set_nested
Umożliwia zagnieżdżone równoległość.
void omp_set_nested(
int val
);
Parametry
Val
Wartość niezerowa umożliwia zagnieżdżone równoległość, a zero wyłącza zagnieżdżone równoległość.
Uwagi
Równoległość zagnieżdżona protokołu OMP może być włączona za pomocą omp_set_nested
polecenia lub przez ustawienie zmiennej środowiskowej OMP_NESTED .
Ustawienie parametru spowoduje omp_set_nested
zastąpienie ustawienia zmiennej środowiskowej OMP_NESTED
.
Włączenie zmiennej środowiskowej może spowodować przerwanie w inny sposób programu operacyjnego, ponieważ liczba wątków zwiększa się wykładniczo podczas zagnieżdżania regionów równoległych. Na przykład funkcja, która powtarza się sześć razy z liczbą wątków OMP ustawionych na 4, wymaga 4096 (4 do mocy 6) wątków. Z wyjątkiem aplikacji powiązanych z we/wy wydajność aplikacji zwykle spada, jeśli istnieje więcej wątków niż procesory.
Użyj omp_get_nested, aby wyświetlić bieżące ustawienie .omp_set_nested
Aby uzyskać więcej informacji, zobacz funkcja omp_set_nested 3.1.9.
Przykład
// 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
Ustawia liczbę wątków w nadchodzących regionach równoległych, chyba że zostanie zastąpiona przez klauzulę num_threads .
void omp_set_num_threads(
int num_threads
);
Parametry
num_threads
Liczba wątków w regionie równoległym.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcja omp_set_num_threads 3.1.1.
Przykład
Zobacz omp_get_num_threads , aby zapoznać się z przykładem użycia elementu omp_set_num_threads
.
omp_test_lock
Próbuje ustawić blokadę, ale nie blokuje wykonywania wątku.
int omp_test_lock(
omp_lock_t *lock
);
Parametry
lock
Zmienna typu omp_lock_t
zainicjowana przy użyciu omp_init_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_test_lock 3.2.5 i omp_test_nest_lock.
Przykład
// 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
Próbuje ustawić blokadę zagnieżdżalną, ale nie blokuje wykonywania wątku.
int omp_test_nest_lock(
omp_nest_lock_t *lock
);
Parametry
lock
Zmienna typu omp_nest_lock_t
zainicjowana przy użyciu omp_init_nest_lock.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_test_lock 3.2.5 i omp_test_nest_lock.
Przykład
// 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
Zwalnia blokadę.
void omp_unset_lock(
omp_lock_t *lock
);
Parametry
lock
Zmienna typu omp_lock_t
zainicjowana przy użyciu omp_init_lock, należąca do wątku i wykonywana w funkcji.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_unset_lock 3.2.4 i omp_unset_nest_lock.
Przykład
Zobacz omp_init_lock , aby zapoznać się z przykładem użycia elementu omp_unset_lock
.
omp_unset_nest_lock
Zwalnia blokadę zagnieżdżalną.
void omp_unset_nest_lock(
omp_nest_lock_t *lock
);
Parametry
lock
Zmienna typu omp_nest_lock_t
zainicjowana przy użyciu omp_init_nest_lock, należąca do wątku i wykonywana w funkcji.
Uwagi
Aby uzyskać więcej informacji, zobacz funkcje omp_unset_lock 3.2.4 i omp_unset_nest_lock.
Przykład
Zobacz omp_init_nest_lock , aby zapoznać się z przykładem użycia elementu omp_unset_nest_lock
.