Функции 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.