Udostępnij za pośrednictwem


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