Поделиться через


Функции OpenMP

Предоставляет ссылки на функции, используемые в API OpenMP.

Реализация Visual C++ стандарта OpenMP включает следующие функции и типы данных.

Для выполнения среды:

Function Description
omp_set_num_threads Задает количество потоков в предстоящих параллельных регионах, если не переопределяется предложением num_threads .
omp_get_num_threads Возвращает количество потоков в параллельном регионе.
omp_get_max_threads Возвращает целое число, равное или большее числу потоков, которые будут доступны, если параллельная область без num_threads была определена в этом коде.
omp_get_thread_num Возвращает число потоков потока, выполняемого в команде потоков.
omp_get_num_procs Возвращает количество процессоров, доступных при вызове функции.
omp_in_parallel Возвращает ненулевое значение, если вызывается из параллельного региона.
omp_set_dynamic Указывает, что количество потоков, доступных в предстоящих параллельных регионах, можно настроить по времени выполнения.
omp_get_dynamic Возвращает значение, указывающее, можно ли настроить количество потоков, доступных в предстоящих параллельных регионах, по времени выполнения.
omp_set_nested Включает вложенный параллелизм.
omp_get_nested Возвращает значение, указывающее, включен ли вложенный параллелизм.

Для блокировки:

Function Description
omp_init_lock Инициализирует простую блокировку.
omp_init_nest_lock Инициализирует блокировку.
omp_destroy_lock Неинициализирует блокировку.
omp_destroy_nest_lock Неинициализирует вложенную блокировку.
omp_set_lock Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.
omp_set_nest_lock Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.
omp_unset_lock Освобождает блокировку.
omp_unset_nest_lock Освобождает вложенную блокировку.
omp_test_lock Пытается установить блокировку, но не блокирует выполнение потока.
omp_test_nest_lock Пытается задать вложенную блокировку, но не блокирует выполнение потока.
Тип данных Description
omp_lock_t Тип, содержащий состояние блокировки, доступно ли блокировка или если поток владеет блокировкой.
omp_nest_lock_t Тип, содержащий одну из следующих частей информации о блокировке: доступна ли блокировка, а также удостоверение потока, которому принадлежит блокировка и число вложенных объектов.

Для подпрограмм времени:

Function Description
omp_get_wtime Возвращает значение в секундах времени, прошедшего с некоторого момента.
omp_get_wtick Возвращает количество секунд между тактовами процессора.

omp_destroy_lock

Неинициализирует блокировку.

void omp_destroy_lock(
   omp_lock_t *lock
);

Параметры

lock
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.2 omp_destroy_lock и omp_destroy_nest_lock функций.

Пример

Пример использования omp_destroy_lockсм. в omp_init_lock.

omp_destroy_nest_lock

Неинициализирует вложенную блокировку.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

Параметры

lock
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.2 omp_destroy_lock и omp_destroy_nest_lock функций.

Пример

Пример использования omp_destroy_nest_lockсм. в omp_init_nest_lock.

omp_get_dynamic

Возвращает значение, указывающее, можно ли настроить количество потоков, доступных в предстоящих параллельных регионах, по времени выполнения.

int omp_get_dynamic();

Возвращаемое значение

Ненулевое значение означает, что потоки будут динамически скорректированы.

Замечания

Динамическая корректировка потоков указывается с omp_set_dynamic и OMP_DYNAMIC.

Дополнительные сведения см. в разделе 3.1.7 omp_set_dynamic функции.

Пример

Пример использования omp_get_dynamicсм. в omp_set_dynamic.

omp_get_max_threads

Возвращает целое число, равное или большее числу потоков, которые будут доступны, если параллельная область без num_threads была определена в этом коде.

int omp_get_max_threads( )

Замечания

Дополнительные сведения см. в разделе 3.1.3 omp_get_max_threads функции.

Пример

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

Возвращает значение, указывающее, включен ли вложенный параллелизм.

int omp_get_nested( );

Возвращаемое значение

Ненулевое значение означает, что вложенная параллелизм включена.

Замечания

Вложенный параллелизм указывается с omp_set_nested и OMP_NESTED.

Дополнительные сведения см. в разделе 3.1.10 omp_get_nested функции.

Пример

Пример использования omp_get_nestedсм. в omp_set_nested.

omp_get_num_procs

Возвращает количество процессоров, доступных при вызове функции.

int omp_get_num_procs();

Замечания

Дополнительные сведения см. в разделе 3.1.5 omp_get_num_procs функции.

Пример

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

Возвращает количество потоков в параллельном регионе.

int omp_get_num_threads( );

Замечания

Дополнительные сведения см. в разделе 3.1.2 omp_get_num_threads функции.

Пример

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

Возвращает число потоков потока, выполняемого в команде потоков.

int omp_get_thread_num( );

Замечания

Дополнительные сведения см. в разделе 3.1.4 omp_get_thread_num функции.

Пример

Пример использования omp_get_thread_numсм. в параллельном режиме.

omp_get_wtick

Возвращает количество секунд между тактовами процессора.

double omp_get_wtick( );

Замечания

Дополнительные сведения см. в разделе 3.3.2 omp_get_wtick функции.

Пример

Пример использования omp_get_wtickсм. в omp_get_wtime.

omp_get_wtime

Возвращает значение в секундах времени, прошедшего с некоторого момента.

double omp_get_wtime( );

Возвращаемое значение

Возвращает значение в секундах времени, прошедшего из некоторой произвольной точки, но согласованной.

Замечания

Эта точка будет оставаться согласованной во время выполнения программы, что позволяет выполнять предстоящие сравнения.

Дополнительные сведения см. в разделе 3.3.1 omp_get_wtime функции.

Пример

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

Возвращает ненулевое значение, если вызывается из параллельного региона.

int omp_in_parallel( );

Замечания

Дополнительные сведения см. в разделе 3.1.6 omp_in_parallel функции.

Пример

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

Инициализирует простую блокировку.

void omp_init_lock(
   omp_lock_t *lock
);

Параметры

lock
Переменная типа omp_lock_t.

Замечания

Дополнительные сведения см. в разделе 3.2.1 omp_init_lock и omp_init_nest_lock функций.

Пример

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

Инициализирует блокировку.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

Параметры

lock
Переменная типа omp_nest_lock_t.

Замечания

Начальное число вложений равно нулю.

Дополнительные сведения см. в разделе 3.2.1 omp_init_lock и omp_init_nest_lock функций.

Пример

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

Указывает, что количество потоков, доступных в предстоящих параллельных регионах, можно настроить по времени выполнения.

void omp_set_dynamic(
   int val
);

Параметры

Val
Значение, указывающее, можно ли настроить количество потоков, доступных в предстоящих параллельных регионах, с помощью среды выполнения. Если ненулевое значение, среда выполнения может настроить количество потоков, если ноль, среда выполнения не будет динамически настраивать количество потоков.

Замечания

Число потоков никогда не превысит значение, заданное omp_set_num_threads или OMP_NUM_THREADS.

Используйте omp_get_dynamic для отображения текущего omp_set_dynamicпараметра .

Параметр для omp_set_dynamic параметра переопределяет параметр переменной среды OMP_DYNAMIC .

Дополнительные сведения см. в разделе 3.1.7 omp_set_dynamic функции.

Пример

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

Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.

void omp_set_lock(
   omp_lock_t *lock
);

Параметры

lock
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.3 omp_set_lock и omp_set_nest_lock функций.

Примеры

Пример использования omp_set_lockсм. в omp_init_lock.

omp_set_nest_lock

Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

Параметры

lock
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.3 omp_set_lock и omp_set_nest_lock функций.

Примеры

Пример использования omp_set_nest_lockсм. в omp_init_nest_lock.

omp_set_nested

Включает вложенный параллелизм.

void omp_set_nested(
   int val
);

Параметры

Val
Ненулевое значение включает вложенный параллелизм, а ноль отключает вложенный параллелизм.

Замечания

Вложенный параллелизм OMP можно включить с omp_set_nestedпомощью или задать переменную среды OMP_NESTED .

Параметр для omp_set_nested параметра переопределяет параметр переменной OMP_NESTED среды.

Включение переменной среды может нарушить иначе операционную программу, так как количество потоков увеличивается экспоненциально при вложении параллельных регионов. Например, функция, которая рекурсирует шесть раз с числом потоков OMP, равным 4, требуется 4096 (4 к мощности 6) потоков. За исключением приложений с привязкой ввода-вывода, производительность приложения обычно снижается, если есть больше потоков, чем процессоры.

Используйте omp_get_nested для отображения текущего omp_set_nestedпараметра.

Дополнительные сведения см. в разделе 3.1.9 omp_set_nested функции.

Пример

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

Задает количество потоков в предстоящих параллельных регионах, если не переопределяется предложением num_threads .

void omp_set_num_threads(
   int num_threads
);

Параметры

num_threads
Количество потоков в параллельном регионе.

Замечания

Дополнительные сведения см. в разделе 3.1.1 omp_set_num_threads функции.

Пример

Пример использования omp_set_num_threadsсм. в omp_get_num_threads.

omp_test_lock

Пытается установить блокировку, но не блокирует выполнение потока.

int omp_test_lock(
   omp_lock_t *lock
);

Параметры

lock
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.5 omp_test_lock и omp_test_nest_lock функций.

Пример

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

Пытается задать вложенную блокировку, но не блокирует выполнение потока.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

Параметры

lock
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.

Замечания

Дополнительные сведения см. в разделе 3.2.5 omp_test_lock и omp_test_nest_lock функций.

Пример

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

Освобождает блокировку.

void omp_unset_lock(
   omp_lock_t *lock
);

Параметры

lock
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock, принадлежащей потоку и выполняющейся в функции.

Замечания

Дополнительные сведения см. в разделе 3.2.4 omp_unset_lock и omp_unset_nest_lock функций.

Пример

Пример использования omp_unset_lockсм. в omp_init_lock.

omp_unset_nest_lock

Освобождает вложенную блокировку.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

Параметры

lock
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock, принадлежащей потоку и выполняющейся в функции.

Замечания

Дополнительные сведения см. в разделе 3.2.4 omp_unset_lock и omp_unset_nest_lock функций.

Пример

Пример использования omp_unset_nest_lockсм. в omp_init_nest_lock.