Программирование с использованием OpenMP
Подпрограммы
-
void omp_set_num_threads(int threads); subroutine omp_set_num_threads(threads) integer threads
Задает количество потоков (threads) при выполнении параллельных секций программы
-
int omp_get_num_threads(void); integer function omp_get_num_threads()
Возвращает количество потоков, используемых для выполнения параллельной секции.
-
void omp_set_nested(int nested); subroutine omp_set_nested(nested) integer nested
Разрешает или запрещает вложенный параллелизм. По умолчанию запрещен.
-
int omp_get_nested(void); logical function omp_get_nested()
Определяет, разрешен ли вложенный параллелизм.
-
void omp_init_lock(omp_lock_t *lock); subroutine omp_init_lock(lock) integer(kind = omp_lock_kind) :: lock
Инициализирует блокировку, связанную с идентификатором lock, для использования в последующих вызовах.
-
void omp_set_lock(omp_lock_t *lock); subroutine omp_set_lock(lock) integer(kind = omp_lock_kind) :: lock
Переводит потоки из состояния выполнения в состояние ожидания до тех пор, пока блокировка, связанная с идентификатором lock, не окажется доступной. Поток становится владельцем доступной блокировки.
-
void omp_unset_lock(omp_lock_t *lock); subroutine omp_unset_lock(lock) integer(kind = omp_lock_kind) :: lock
После выполнения вызова поток перестает быть владельцем блокировки, связанной с идентификатором lock. Если поток не был владельцем блокировки, результат вызова не определен.
Таймеры
-
double omp_get_wtime(void); double precision function omp_get_wtime()
Время в секундах, прошедшее с произвольного момента в прошлом. Точка отсчета остается неизменной в течение всего времени выполнения программы
-
double omp_get_wtick(void); double precision function omp_get_wtick()
Время в секундах, прошедшее между последовательными "тиками". Это время является мерой точности таймера.
Переменные окружения
Переменные окружения задаются следующим образом:
export ПЕРЕМЕННАЯ=значение (UNIX) set ПЕРЕМЕННАЯ=значение (Microsoft Windows)
-
OMP_NUM_THREADS
Задает количество нитей при выполнении параллельных секций программы.
-
OMP_SCHEDULE
Задает способ распределения итераций циклов между нитями. Возможные значения:
static; dynamic; guided.
Количество итераций (необязательный параметр) указывается после одного из этих ключевых слов, отделяясь от него запятой, например:
export OMP_SCHEDULE="static, 10"
Примеры
-
program omp_example integer i, k, N real*4 sum, h, x print *, "Please, type in N:" read *, N h = 1.0 / N sum = 0.0 !$OMP PARALLEL DO SCHEDULE(STATIC) REDUCTION(+:sum) do i = 1, N x = i * h sum = sum + 1.e0 * h / (1.e0 + x**2) enddo print *, 4.0 * sum end
-
#include "omp.h" #include <stdio.h > double f(double x) { return 4.0 / (1 + x * x); } main () { const long N = 100000; long i; double h, sum, x; sum = 0; h = 1.0 / N; #pragma omp parallel shared(h) { #pragma omp for private(x) reduction(+:sum) for (i = 0; i < N; i++) { x = h * (i + 0.5); sum = sum + f(x); } } printf("PI = %f\n", sum / N); }
Поддержка
OpenMP поддерживается компиляторами Intel®, GCC и другими.
Компиляция OpenMP-программ выполняется с ключом -openmp или –fopenmp.