OpenMP
Подпрограммы для работы с блокировками
Блокировки используются для предотвращения эффектов, приводящих к непредсказуемому (недетерминированному) поведению программы. Среди таких эффектов, например, гонки за данными, когда более чем один поток имеет доступ к одной и той же переменной.
void omp_init_lock(omp_lock_t *lock); subroutine omp_init_lock(lock) integer(kind = omp_lock_kind) :: lock
Инициализирует блокировку, связанную с идентификатором lock, для использования в последующих вызовах подпрограмм.
void omp_destroy_lock(omp_lock_t *lock); subroutine omp_destroy_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. Если поток не был владельцем блокировки, результат вызова не определен.
int omp_test_lock(omp_lock_t *lock); logical function omp_test_lock(lock) integer(kind = omp_lock_kind) :: lock
Возвращает значение "истина", если блокировка связана с идентификатором lock.
void omp_init_nest_lock(omp_nest_lock_t *lock); subroutine omp_init_nest_lock(lock) integer(kind = omp_nest_lock_kind) :: lock
Инициализирует вложенную блокировку, связанную с идентификатором lock.
void omp_destroy_nest_lock(omp_nest_lock_t *lock); subroutine omp_destroy_nest_lock(lock) integer(kind = omp_nest_lock_kind) :: lock
Переводит вложенную блокировку, связанную с идентификатором lock, в состояние неопределенности.
void omp_set_nest_lock(omp_nest_lock_t *lock); subroutine omp_set_nest_lock(lock) integer(kind= omp_nest_lock_kind) :: lock
Переводит выполняющиеся потоки в состояние ожидания до тех пор, пока вложенная блокировка, связанная с идентификатором lock, не станет доступной. Поток становится владельцем блокировки.
void omp_unset_nest_lock(omp_nest_lock_t *lock); subroutine omp_unset_nest_lock(lock) integer(kind = omp_nest_lock_kind) :: lock
Освобождает выполняющийся поток от владения вложенной блокировкой, связанной с идентификатором lock. Если поток не был владельцем блокировки, результат не определен.
int omp_test_nest_lock(omp_nest_lock_t *lock); integer function omp_test_nest_lock(lock) integer(kind = omp_nest_lock_kind) :: lock
Функция, позволяющая определить, связана ли вложенная блокировка с идентификатором lock . Если связана, возвращается значение счетчика, в противном случае возвращается значение 0.
Таймеры
Для профилирования OpenMP программы можно использовать таймеры.
double omp_get_wtime(void); double precision function omp_get_wtime()
Возвращает время в секундах, прошедшее с произвольного момента в прошлом. Точка отсчета остается неизменной в течение всего времени выполнения программы.
double omp_get_wtick(void); double precision function omp_get_wtick()
Возвращает время в секундах, прошедшее между последовательными "тиками". Это время является мерой точности таймера.
Переменные окружения OpenMP
Переменные окружения задаются следующим образом:
- export ПЕРЕМЕННАЯ=значение (в среде UNIX )
- set ПЕРЕМЕННАЯ=значение (в среде Microsoft Windows )
OMP_NUM_THREADS
Задает количество нитей при выполнении параллельных секций программы.
OMP_SCHEDULE
Задает способ распределения итераций циклов между нитями. Возможные значения:
- static ;
- dynamic ;
- guided
Количество итераций (необязательный параметр) указывается после одного из этих ключевых слов, отделяясь от него запятой, например:
export OMP_SCHEDULE="static, 10" OMP_DYNAMIC
Если этой переменной присвоено значение false, динамическое распределение итераций циклов между нитями запрещено, если true - разрешено.
OMP_NESTED
Если этой переменной присвоено значение false, вложенный параллелизм запрещен, если true - разрешен.