Смекни!
smekni.com

Что такое OpenMP? (стр. 2 из 2)

FLUSH
Явно определяет точку, в которой реализация должна обеспечить одинаковый вид памяти для всех нитей. Неявно FLUSH присутствует в следующих директивах: BARRIER, CRITICAL, END CRITICAL, END DO, END PARALLEL, END SECTIONS, END SINGLE, ORDERED, END ORDERED.

В целях синхронизации можно также пользоваться механизмом замков (locks).

3. Классы переменных

В OpenMP переменные в параллельных областях программы разделяются на два основных класса:

  • SHARED (общие; под именем A все нити видят одну переменную) и
  • PRIVATE (приватные; под именем A каждая нить видит свою переменную).

Отдельные правила определяют поведение переменных при входе и выходе из параллельной области или параллельного цикла: REDUCTION, FIRSTPRIVATE, LASTPRIVATE, COPYIN.

По умолчанию, все COMMON-блоки, а также переменные, порожденные вне параллельной области, при входе в эту область остаются общими (SHARED). Исключение составляют переменные - счетчики итераций в цикле, по очевидным причинам. Переменные, порожденные внутри параллельной области, являются приватными (PRIVATE). Явно назначить класс переменных по умолчанию можно с помощью клаузы DEFAULT.

SHARED
Применяется к переменным, которые необходимо сделать общими.

PRIVATE
Применяется к переменным, которые необходимо сделать приватными. При входе в параллельную область для каждой нити создается отдельный экземпляр переменной, который не имеет никакой связи с оригинальной переменной вне параллельной области.

THREADPRIVATE
Применяется к COMMON-блокам, которые необходимо сделать приватными. Директива должна применяться после каждой декларации COMMON-блока.

FIRSTPRIVATE
Приватные копии переменной при входе в параллельную область инициализируются значением оригинальной переменной.

LASTPRIVATE
По окончании параллельно цикла или блока параллельных секций, нить, которая выполнила последнюю итерацию цикла или последнюю секцию блока, обновляет значение оригинальной переменной.

REDUCTION(+:A)
Обозначает переменную, с которой в цикле производится reduction-операция (например, суммирование). При выходе из цикла, данная операция производится над копиями переменной во всех нитях, и результат присваивается оригинальной переменной.

COPYIN
Применяется к COMMON-блокам, которые помечены как THREADPRIVATE. При входе в параллельную область приватные копии этих данных инициализируются оригинальными значениями.

4. Runtime-процедуры и переменные среды

В целях создания переносимой среды запуска параллельных программ, в OpenMP определен ряд переменных среды, контролирующих поведение приложения.

В OpenMP предусмотрен также набор библиотечных процедур, которые позволяют:

  • во время исполнения контролировать и запрашивать различные параметры, определяющие поведение приложения (такие как число нитей и процессоров, возможность вложенного параллелизма); процедуры назначения параметров имеют приоритет над соотвествующими переменными среды.
  • использовать синхронизацию на базе замков (locks).

Переменные среды

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.

5. Спецификация OpenMP для языков C/C++

Спецификация 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) замки - вместо логических переменных используются целые числа, и нить, уже захватившая замок, при повторном хахвате может увеличить это число.

Пример распараллеливания for-цикла в C

#pragma omp parallel for private(i) #pragma omp shared(x, y, n) reduction(+: a, b)for (i=0; i<n; i++) { a = a + x[i]; b = b + y[i];}

6. Поддержка произвлдителями и разработчиками. Развитие стандарта.

Реализации OpenMP

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).

7. Справочная информация.

Документы для загрузки

  1. OpenMP: A Proposed Industry Stadard API for Shared Memory Programming. Октябрь 1997. (Postcript, 100K)
  2. OpenMP Fortran API. Октябрь 1997. (PDF, 127K)
  3. OpenMP C/C++ API. Октябрь 1998. (PDF, 201K)

Ссылки

  • OpenMP FAQ
  • OpenMP tutorial, мультимедийный учебник/справочник по OpenMP, подготовленный в университете Бостона. http://scv.bu.edu/SCV/Tutorials/OpenMP/

© Лаборатория Параллельных Информационных Технологий, НИВЦ МГУ