FLUSH
Явно определяет точку, в которой реализация должна обеспечить одинаковый вид памяти для всех нитей. Неявно FLUSH присутствует в следующих директивах: BARRIER, CRITICAL, END CRITICAL, END DO, END PARALLEL, END SECTIONS, END SINGLE, ORDERED, END ORDERED.
В целях синхронизации можно также пользоваться механизмом замков (locks).
В OpenMP переменные в параллельных областях программы разделяются на два основных класса:
Отдельные правила определяют поведение переменных при входе и выходе из параллельной области или параллельного цикла: REDUCTION, FIRSTPRIVATE, LASTPRIVATE, COPYIN.
По умолчанию, все COMMON-блоки, а также переменные, порожденные вне параллельной области, при входе в эту область остаются общими (SHARED). Исключение составляют переменные - счетчики итераций в цикле, по очевидным причинам. Переменные, порожденные внутри параллельной области, являются приватными (PRIVATE). Явно назначить класс переменных по умолчанию можно с помощью клаузы DEFAULT.
SHARED
Применяется к переменным, которые необходимо сделать общими.
PRIVATE
Применяется к переменным, которые необходимо сделать приватными. При входе в параллельную область для каждой нити создается отдельный экземпляр переменной, который не имеет никакой связи с оригинальной переменной вне параллельной области.
THREADPRIVATE
Применяется к COMMON-блокам, которые необходимо сделать приватными. Директива должна применяться после каждой декларации COMMON-блока.
FIRSTPRIVATE
Приватные копии переменной при входе в параллельную область инициализируются значением оригинальной переменной.
LASTPRIVATE
По окончании параллельно цикла или блока параллельных секций, нить, которая выполнила последнюю итерацию цикла или последнюю секцию блока, обновляет значение оригинальной переменной.
REDUCTION(+:A)
Обозначает переменную, с которой в цикле производится reduction-операция (например, суммирование). При выходе из цикла, данная операция производится над копиями переменной во всех нитях, и результат присваивается оригинальной переменной.
COPYIN
Применяется к COMMON-блокам, которые помечены как THREADPRIVATE. При входе в параллельную область приватные копии этих данных инициализируются оригинальными значениями.
В целях создания переносимой среды запуска параллельных программ, в OpenMP определен ряд переменных среды, контролирующих поведение приложения.
В OpenMP предусмотрен также набор библиотечных процедур, которые позволяют:
OMP_SCHEDULE
Определяет способ распределения итераций в цикле, если в директиве DO использована клауза SCHEDULE(RUNTIME).
OMP_NUM_THREADS
Определяет число нитей для исполнения параллельных областей приложения.
OMP_DYNAMIC
Разрешает или запрещает динамическое изменение числа нитей.
OMP_NESTED
Разрешает или запрещает вложенный параллелизм.
OMP_SET_NUM_THREADS
Позволяет назначить максимальное число нитей для использования в следующей параллельной области (если это число разрешено менять динамически). Вызывается из последовательной области программы.
OMP_GET_MAX_THREADS
Возвращает максимальное число нитей.
OMP_GET_NUM_THREADS
Возвращает фактическое число нитей в параллельной области программы.
OMP_GET_NUM_PROCS
Возвращает число процессоров, доступных приложению.
OMP_IN_PARALLEL
Возвращает .TRUE., если вызвана из параллельной области программы.
OMP_SET_DYNAMIC / OMP_GET_DYNAMIC
Устанавливает/запрашивает состояние флага, разрешающего динамически изменять число нитей.
OMP_GET_NESTED / OMP_SET_NESTED
Устанавливает/запрашивает состояние флага, разрешающего вложенный параллелизм.
В качестве замков используются общие переменные типа INTEGER (размер должен быть достаточным для хранения адреса). Данные переменные должны использоваться только как параметры примитивов синхронизации.
OMP_INIT_LOCK(var) / OMP_DESTROY_LOCK(var)
Инициализирует замок, связанный с переменной var.
OMP_SET_LOCK
Заставляет вызвавшую нить дождаться освобождения замка, а затем захватывает его.
OMP_UNSET_LOCK
Освобождает замок, если он был захвачен вызвавшей нитью.
OMP_TEST_LOCK
Пробует захватить указанный замок. Если это невозможно, возвращает .FALSE.
Спецификация OpenMP для C/C++, выпущенная на год позже фортранной, содержит в основном аналогичную функциональность.
Необходимо лишь отметить следующие моменты:
1) Вместо спецкомментариев используются директивы компилятора "#pragma omp".
2) Компилятор с поддержкой OpenMP определяет макрос "_OPENMP", который может использоваться для условной компиляции отдельных блоков, характерных для параллельной версии программы.
3) Распараллеливание применяется к for-циклам, для этого используется директива "#pragma omp for". В параллельных циклах запрещается использовать оператор break.
4) Статические (static) переменные, определенные в параллельной области программы, являются общими (shared).
5) Память, выделенная с помощью malloc(), является общей (однако указатель на нее может быть как общим, так и приватным).
6) Типы и функции OpenMP определены во включаемом файле <omp.h>.
7) Кроме обычных, возможны также "вложенные" (nested) замки - вместо логических переменных используются целые числа, и нить, уже захватившая замок, при повторном хахвате может увеличить это число.
1) Silicon Graphics. Поддержка OpenMP для Fortran реализована в компиляторах Fortran 77/90 семейства MIPSpro для платформы IRIX начиная с версии 7.2.1. В версии 7.3 появится поддержка OpenMP для C/C++.
2) Compaq/DEC. DIGITAL Fortran поддерживает распараллеливание в стандарте OpenMP для Фортрана.
3) Kuck & Associates (KAI). Guide - полная реализация OpenMP как для Фортрана, так и для C/C++. Подробнее: http://www.kai.com/parallel/kappro/guide/.
4) Portland Group (PGI). Пакет PGI Workstation 3.0 поддерживает OpenMP для Fortran и C/C++ на платформах Windows NT, Linux, Solaris (x86).
5) OdinMP. OpenMP-препроцессор для языка С, генерация программы в стандарте POSIX threads. См. новости.
6) Sun поддерживает стандарт OpenMP. Предполагается, что реализация OpenMP войдет в будущие версии серии продуктов Sun Performance Workshop Fortran, поставляемых с высокопроизводительными серверами Sun. Sun войдет в организацию OpenMP Architecture Board, занимающуюся стандартизацией OpenMP.
7) Компания Tera Computer анонсировала поддержку OpenMP на своих системах Tera MTA.
8) Компания Pacific-Sierra Research предлагает VAST/Parallel - распараллеливающие препроцессоры для Fortran и С с поддержкой стандарта OpenMP. Средство распараллеливания VAST/toOpenMP распознает параллелизм и автоматически добавляет в Fortran-программу директивы OpenMP.
1) CGWAVE: Моделирование океанских волн. Совместное использование OpenMP (KAI KAP/Pro Toolset) и MPI.
2) Подробнее: http://www.wes.hpc.mil/news/SC98/HPCchallenge4a.htm. Новости: Вручена премия за новую технологию моделирования водных поверхностей.
2) Страница на сайте KAI - параллельные приложения, в т.ч. распараллеленные с помощью OpenMP.
OpenMP задуман как расширяемый стандарт. В конце 1999 года должна появится вторая версия спецификации для языка Fortran, в которой будут учтены требования разработчиков.
В настоящее время OpenMP ARB собирает предложения по улучшению стандарта (более подробно - на www.openmp.org).
С 30 сентября по 1 октября 1999 г. в Lund University (Швеция) прошла первая европейская конференция, посвященная OpenMP - First European Workshop on OpenMP (EWOMP'99).
© Лаборатория Параллельных Информационных Технологий, НИВЦ МГУ