Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предоставляет ссылки на функции, используемые в API OpenMP.
Реализация Visual C++ стандарта OpenMP включает следующие функции и типы данных.
Для выполнения в среде:
| Функция | Описание |
|---|---|
| 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 | Возвращает значение, указывающее, включен ли вложенный параллелизм. |
Для блокировки:
| Функция | Описание |
|---|---|
| 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 | Пытается задать вложенную блокировку, но не блокирует выполнение потока. |
| Тип данных | Описание |
|---|---|
omp_lock_t |
Тип, содержащий состояние блокировки, доступно ли блокировка или если поток владеет блокировкой. |
omp_nest_lock_t |
Тип, содержащий одну из следующих частей информации о блокировке: доступна ли блокировка и идентификация потока, которому принадлежит блокировка, а также количество уровней вложенности. |
Для управления временными интервалами:
| Функция | Описание |
|---|---|
| omp_get_wtime | Возвращает значение в секундах времени, прошедшего с некоторого момента. |
| omp_get_wtick | Возвращает количество секунд между тактовами процессора. |
omp_destroy_lock
Деинициализирует замок.
void omp_destroy_lock(
omp_lock_t *lock
);
Параметры
блокировка
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock.
Замечания
Дополнительные сведения см. в разделе 3.2.2 функции omp_destroy_lock и функции omp_destroy_nest_lock.
Пример
Смотрите omp_init_lock в качестве примера использования omp_destroy_lock.
omp_destroy_nest_lock
Деинициализирует вложенную блокировку.
void omp_destroy_nest_lock(
omp_nest_lock_t *lock
);
Параметры
блокировка
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.
Замечания
Дополнительные сведения см. в разделе 3.2.2 функций omp_destroy_lock и omp_destroy_nest_lock.
Пример
См. omp_init_nest_lock для примера использования omp_destroy_nest_lock.
omp_get_dynamic
Возвращает значение, указывающее, можно ли во время выполнения настроить количество потоков, доступных в предстоящих параллельных регионах.
int omp_get_dynamic();
Возвращаемое значение
Ненулевое значение означает, что потоки будут динамически скорректированы.
Замечания
Динамическая корректировка потоков указывается с omp_set_dynamic и OMP_DYNAMIC.
Дополнительные сведения см. в функции 3.1.7 omp_set_dynamic.
Пример
См. omp_set_dynamic для примера использования omp_get_dynamic.
omp_get_max_threads
Возвращает целое число, равное или большее числу потоков, которые будут доступны, если параллельная область без num_threads будет определена в этой точке кода.
int omp_get_max_threads( )
Замечания
Дополнительные сведения см. в разделе функции omp_get_max_threads 3.1.3.
Пример
// 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_set_nested для примера использования omp_get_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.
Пример
См. parallel для примера использования в omp_get_thread_num режиме.
omp_get_wtick (функция измерения времени)
Возвращает количество секунд между тактовами процессора.
double omp_get_wtick( );
Замечания
Дополнительные сведения см. в разделе функции 3.3.2 omp_get_wtick.
Пример
Смотрите omp_get_wtime для примера использования omp_get_wtick.
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_в_параллели
Возвращает ненулевое значение, если вызывается из параллельного региона.
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
);
Параметры
блокировка
Переменная типа 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
);
Параметры
блокировка
Переменная типа 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
);
Параметры
блокировка
Переменная типа omp_lock_t , которая была инициализирована с omp_init_lock.
Замечания
Дополнительные сведения см. в 3.2.3 функции omp_set_lock и omp_set_nest_lock.
Примеры
Смотрите omp_init_lock в качестве примера использования omp_set_lock.
omp_set_nest_lock
Блокирует выполнение потока до тех пор, пока блокировка не станет доступной.
void omp_set_nest_lock(
omp_nest_lock_t *lock
);
Параметры
блокировка
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.
Замечания
Дополнительные сведения см. в разделе 3.2.3 функций omp_set_lock и omp_set_nest_lock.
Примеры
См. omp_init_nest_lock для примера использования omp_set_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_get_num_threads для примера использования omp_set_num_threads.
omp_test_lock
Пытается установить блокировку, но не блокирует выполнение потока.
int omp_test_lock(
omp_lock_t *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
);
Параметры
блокировка
Переменная типа omp_nest_lock_t , которая была инициализирована с omp_init_nest_lock.
Замечания
Дополнительные сведения см. в функциях omp_test_lock и omp_test_nest_lock в 3.2.5.
Пример
// 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
);
Параметры
блокировка
Переменная типа omp_lock_t, инициализированная с omp_init_lock, принадлежащая потоку и выполняющаяся в функции.
Замечания
Дополнительные сведения см. в разделе 3.2.4 функций omp_unset_lock и omp_unset_nest_lock.
Пример
Смотрите omp_init_lock в качестве примера использования omp_unset_lock.
omp_unset_nest_lock
Освобождает вложенную блокировку.
void omp_unset_nest_lock(
omp_nest_lock_t *lock
);
Параметры
блокировка
Переменная типа omp_nest_lock_t, которая была инициализирована с помощью omp_init_nest_lock, управляется потоком и выполняется в функции.
Замечания
Дополнительные сведения см. в разделе 3.2.4 функции omp_unset_lock и omp_unset_nest_lock.
Пример
См. omp_init_nest_lock для примера использования omp_unset_nest_lock.