Главная страница
Навигация по странице:

  • OMP_GET_THREAD_NUM()

  • MASTER ... END MASTER

  • CRITICAL ... END CRITICAL

  • ORDERED ... END ORDERED

  • DEFAULT

  • LASTPRIVATE

  • OMP_NUM_THREADS

  • OMP_SET_NUM_THREADS

  • OMP_GET_MAX_THREADS

  • OMP_GET_NUM_PROCS

  • OMP_SET_DYNAMIC / OMP_GET_DYNAMIC

  • OMP_GET_NESTED / OMP_SET_NESTED

  • OMP_INIT_LOCK(var) / OMP_DESTROY_LOCK(var)

  • OMP_UNSET_LOCK

  • pragma omp

  • Compaq/DEC

  • VAST/Parallel

  • VAST/toOpenMP

  • Лабораторная работа 9,10,11,12 Группа 22120 kif бекпулатов Жавлонбек


    Скачать 272.77 Kb.
    НазваниеЛабораторная работа 9,10,11,12 Группа 22120 kif бекпулатов Жавлонбек
    Дата29.11.2022
    Размер272.77 Kb.
    Формат файлаdocx
    Имя файла1668833239.docx
    ТипЛабораторная работа
    #818254
    страница2 из 5
    1   2   3   4   5
    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/DECDIGITAL 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. Справочная информация.

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

    1. OpenMP: A Proposed Industry Stadard API for Shared Memory Programming. Октябрь 1997. (Postcript, 100K)

    1. OpenMP Fortran API. Октябрь 1997. (PDF, 127K)

    2. OpenMP C/C++ API. Октябрь 1998. (PDF, 201K)


    1   2   3   4   5


    написать администратору сайта