Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ 2015 / ГОСЫ 2015 / Паралнльное программирование .doc
Скачиваний:
25
Добавлен:
15.02.2016
Размер:
175.62 Кб
Скачать

10. Технология программирования OpenMp. Основные конструкции OpenMp с реализации.

Одним из наиболее популярных методов программирования для компьютеров с общей памятью в настоящее время является технология OpenMP. Стандарт OpenMP разработан для языков Фортран, С и С++, содержит спецификации набора директив компилятора, функций и переменных среды окружения. Схематично процесс выполнения OpenMP программ можно представить следующим образом:

Код программы разбивается на последовательные и параллельные области. Выполнение программы начинает "основная" нить. При входе в параллельную область порождаются дополнительные нити, каждая из которых получает свой уникальный номер, причем "основная" нить (мастер) всегда имеет номер 0. Все нити исполняют код, соответствующий параллельной области. При выходе из параллельной области выполняется неявная синхронизация, порожденные нити уничтожаются, работу продолжает основная нить. Далее процесс повторяется. В отличие от MPI, где количество выделенных процессов является статическим и не может изменяться в период выполнения задачи, число нитей может меняться перед каждой параллельной областью. Но в период выполнения параллельной области, изменить количество порожденных нитей нельзя. Параллельные области могут быть вложенными. Принцип обработки вложенных параллельных областей определяет переменная OMP_NESTED, значение которой задается функцией OMP_SET_NESTED. Если переменной OMP_NESTED присвоено истинное значение, допускается вложенный параллелизм, в противном случае и по умолчанию вложенная параллельная область исполняется одной нитью.

Поскольку технология OpenMP основана на использовании общей памяти, она ориентирована на вычислительные системы SMP архитектуры, где реализован механизм эффективной поддержки нитей. Эффективность выполнения OpenMP алгоритма зависит от оптимального использования блоков памяти, обрабатываемых каждой нитью, частоты использования операций синхронизации, при обращении к общим переменным и используемого количества нитей, число которых не должно превышать количества процессорных элементов на вычислительном узле.

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

рrivate - при входе и выходе значение не определено, поэтому при входе требуется инициализация,

firstprivate - при входе инициализируется значением оригинальной переменной, при выходе не определено,

lastprivate - при входе значение не определено, поэтому требуется инициализация, при выходе нить, которая выполнила последнюю итерацию цикла или последней вышла из параллельной области обновляет значение оригинальной переменной полученным значением своей копии защищенной переменной.

Основными конструкциями распараллеливания на общей памяти являются конструкции разделения работ:

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

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

single определяет структурированный блок операторов, который выполняется только одной нитью, первой дошедшей в данную точку программы (не обязательно основной).

Следующим важным функциональным аспектом OpenMP реализации являются операции синхронизации работы нитей. Синхронизация может выполняться явно, вызовом специальных операторов или не явно, например, при выходе из параллельной области. Операции явной синхронизации: master, critical, atomic, barrier, flush.

master определяет блок программы, который будет выполнен только основной нитью. Остальные нити пропускают данный участок и продолжают работу с выполнения оператора, расположенного следом за директивой master.

critical определяет блок программы, который ограничивает выполнение данного блока только одной нитью в одно и тоже время. При объявлении критической секции определяется ее имя. Одномоментно критическую секцию с данным именем может выполнять только одна нить. Если критическая секция уже выполняется какой-либо нитью P0, то все другие нити, выполнившие директиву для критической секции с данным именем, будут заблокированы, пока нить P0 не закончит выполнение данной критической секции, после чего одна из заблокированных на входе нитей войдет в секцию. Если на входе в критическую секцию стояло несколько нитей, то одна из них случайным образом выбирается, остальные нити заблокированы и продолжают ожидание. Критические секции, не имеющие имен, ассоциируются с одним и тем же именем критической секции. Распараллеливание при использовании механизма критических секций достигается за счет объявления секций с разными именами, таким образом, имея 2 разноименные секции будет выполнено распараллеливание на 2 нити и т.д.

atomic предотвращает возможность обновления ячейки памяти общей переменной несколькими, одновременно пишущими в нее нитями и гарантирует, что обновление значения общей переменной будет выполнено атомарно. Данная директива относится к идущему непосредственно за ней оператору. Примерами использования директивы atomic является поиск max/min значений массивов или вычисление суммы значений элементов.

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

flush определяет пересечение нитей (cross-thread) в точке оценки, где требуется гарантия того, что все нити в группе имеют одно и то же видение некоторых объектов памяти. Это означает, что предыдущие вычисления выражений, которые ссылаются на эти объекты памяти, были завершены, а последующие вычисления не начаты.

Помимо директив, стандарт OpenMP содержит набор функций и переменных управления состоянием среды выполнения параллельной программы и синхронизации работы нитей. Прототипы функций и описания переменных находятся в файле <omp.h>, подключение которого является обязательным при разработке OpenMP программ. Полный список функций и переменных окружения приводить не будем. По выполняемым действиям, функции OpenMP дублируют переменные окружения, имеют более высокий приоритет по отношению к переменным, переопределяя из значения, но требуют перекомпиляции программ.

12

Соседние файлы в папке ГОСЫ 2015