Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 515 / 87 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 2:

OpenMP

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Подпрограммы для работы с блокировками

Блокировки используются для предотвращения эффектов, приводящих к непредсказуемому (недетерминированному) поведению программы. Среди таких эффектов, например, гонки за данными, когда более чем один поток имеет доступ к одной и той же переменной.

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 - разрешен.

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Олег Корсак
Олег Корсак
Латвия, Рига
Сергей Шумейко
Сергей Шумейко
Россия, Владимир