Лабораторная работа 9,10,11,12 Группа 22120 kif бекпулатов Жавлонбек
Скачать 272.77 Kb.
|
PARALLEL DO или PARALLEL SECTIONS. Исполнение одной нитью SINGLE ... END SINGLE Определяет блок кода, который будет исполнен только одной нитью (первой, которая дойдет до этого блока). Явное управление распределением работы С помощью функций OMP_GET_THREAD_NUM() и OMP_GET_NUM_THREADS нить может узнать свой номер и общее число нитей, а затем выполнять свою часть работы в зависимости от своего номера (этот подход широко используется в программах на базе интерфейса MPI). Директивы синхронизации MASTER ... END MASTER Определяет блок кода, который будет выполнен только master-ом (нулевой нитью). CRITICAL ... END CRITICAL Определяет критическую секцию, то есть блок кода, который не должен выполняться одновременно двумя или более нитями BARRIER Определяет точку барьерной синхронизации, в которой каждая нить дожидается всех остальных. ATOMIC Определяет переменную в левой части оператора "атомарного" присваивания, которая должна корректно обновляться несколькими нитями. ORDERED ... END ORDERED Определяет блок внутри тела цикла, который должен выполняться в том порядке, в котором итерации идут в последовательном цикле. Может использоваться для упорядочения вывода от параллельных нитей. 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 { 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/ (link is external) . 4) Portland Group (PGI). Пакет PGI Workstation 3.0 поддерживает OpenMP для Fortran и C/C++ на платформах Windows NT, Linux, Solaris (x86). 5) OdinMP (link is external) . 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 (link is external) распознает параллелизм и автоматически добавляет в Fortran-программу директивы OpenMP. Приложения 1) CGWAVE: Моделирование океанских волн. Совместное использование OpenMP (KAI KAP/Pro Toolset) и MPI. Подробнее: http://www.wes.hpc.mil/news/SC98/HPCchallenge4a.htm (link is external) . Новости: Вручена премия за новую технологию моделирования водных поверхностей. 2) Страница на сайте KAI - параллельные приложения (link is external) , в т.ч. распараллеленные с помощью OpenMP. Развитие OpenMP задуман как расширяемый стандарт. В конце 1999 года должна появится вторая версия спецификации для языка Fortran, в которой будут учтены требования разработчиков. В настоящее время OpenMP ARB собирает предложения по улучшению стандарта (более подробно - на www.openmp.org). Конференции С 30 сентября по 1 октября 1999 г. в Lund University (Швеция) прошла первая европейская конференция, посвященная OpenMP - First European Workshop on OpenMP (EWOMP'99). 7. Справочная информация. Документы для загрузки OpenMP: A Proposed Industry Stadard API for Shared Memory Programming. Октябрь 1997. (Postcript, 100K) OpenMP Fortran API. Октябрь 1997. (PDF, 127K) OpenMP C/C++ API. Октябрь 1998. (PDF, 201K) |