Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье
Предоставляет ссылки на функции, используемые в 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 | Возвращает количество секунд между тактовами процессора. |
Неинициализирует блокировку.
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.
Неинициализирует вложенную блокировку.
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.
Возвращает значение, указывающее, можно ли настроить количество потоков, доступных в предстоящих параллельных регионах, по времени выполнения.
int omp_get_dynamic();
Ненулевое значение означает, что потоки будут динамически скорректированы.
Динамическая корректировка потоков указывается с omp_set_dynamic и OMP_DYNAMIC.
Дополнительные сведения см. в разделе 3.1.7 omp_set_dynamic функции.
Пример использования omp_get_dynamic
см. в omp_set_dynamic.
Возвращает целое число, равное или большее числу потоков, которые будут доступны, если параллельная область без 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
Возвращает значение, указывающее, включен ли вложенный параллелизм.
int omp_get_nested( );
Ненулевое значение означает, что вложенная параллелизм включена.
Вложенный параллелизм указывается с omp_set_nested и OMP_NESTED.
Дополнительные сведения см. в разделе 3.1.10 omp_get_nested функции.
Пример использования omp_get_nested
см. в omp_set_nested.
Возвращает количество процессоров, доступных при вызове функции.
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
Возвращает количество потоков в параллельном регионе.
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
Возвращает число потоков потока, выполняемого в команде потоков.
int omp_get_thread_num( );
Дополнительные сведения см. в разделе 3.1.4 omp_get_thread_num функции.
Пример использования omp_get_thread_num
см. в параллельном режиме.
Возвращает количество секунд между тактовами процессора.
double omp_get_wtick( );
Дополнительные сведения см. в разделе 3.3.2 omp_get_wtick функции.
Пример использования 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
Возвращает ненулевое значение, если вызывается из параллельного региона.
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
Инициализирует простую блокировку.
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
Инициализирует блокировку.
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
Указывает, что количество потоков, доступных в предстоящих параллельных регионах, можно настроить по времени выполнения.
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
Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.
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.
Блокирует выполнение потоков до тех пор, пока блокировка не будет доступна.
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.
Включает вложенный параллелизм.
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
Задает количество потоков в предстоящих параллельных регионах, если не переопределяется предложением 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.
Пытается установить блокировку, но не блокирует выполнение потока.
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
Пытается задать вложенную блокировку, но не блокирует выполнение потока.
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
Освобождает блокировку.
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.
Освобождает вложенную блокировку.
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.