
- •Для специальности «Математическое обеспечение и администрирование информационных систем»
- •Dhcp: протокол динамического конфигурирования узлов
- •Аренда dhcp
- •3. Маску подсети;
- •Продление аренды и освобождение ip-адреса
- •OpenMp - модель программирования
- •Ключевые элементы
- •OpenMp - средства синхронизации
- •Синхронизация процессов в OpenMp
- •Синхронизация типа atomic
- •Синхронизация типа critical
- •Синхронизация типа barrier
- •3.3. Пример синхронизации типа barrier Здесь же отметим, что на языке Fortran определение директивы nowait выглядит так:
- •Синхронизация типа master
- •Синхронизация типа ordered
- •Синхронизация типа flush
- •Зарезервированные адреса
- •Структура пакета
- •Внедрение протокола
- •Сравнение с iPv4
- •Основы адресации iPv6
- •Аксиоматика Колмогорова
- •Колмогоровские аксиомы элементарной теории вероятностей
- •Шесть свойств сущностей, необходимых для распределения данных
OpenMp - модель программирования
OpenMP (Open Multi-Processing) — открытый стандарт для распараллеливания программ на языках Си, Си++ и Фортран. Описывает совокупность директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью.
Разработка
Разработку спецификации OpenMP ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией, называемой OpenMP Architecture Review Board (ARB) [1].
Первая версия появилась в 1997 году, предназначалась для языка Fortran. Для С/С++ версия разработана в 1998 году. В 2008 году вышла версия OpenMP 3.0.
Введение
OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор подчиненных (slave) потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков).
Задачи, выполняемые потоками параллельно, также как и данные, требуемые для выполнения этих задач, описываются с помощью специальных директив препроцессора соответствующего языка — прагм. Например, участок кода на языке Fortran, который должен исполняться несколькими потоками, каждый из которых имеет свою копию переменной N, предваряется следующей директивой: !$OMP PARALLEL PRIVATE(N)
Количество создаваемых потоков может регулироваться как самой программой при помощи вызова библиотечных процедур, так и извне, при помощи переменных окружения.
Ключевые элементы
Ключевыми элементами OpenMP являются
конструкции для создания потоков (директива parallel),
конструкции распределения работы между потоками (директивы DO/for и section),
конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных),
конструкции для синхронизации потоков (директивы critical, atomic и barrier),
процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),
переменные окружения (например, OMP_NUM_THREADS).
OpenMp - средства синхронизации
Синхронизация процессов в OpenMp
Проблема синхронизации параллельных потоков важна не только для параллельного программирования с использованием OpenMP, но и для всего параллельного программирования в целом. Проблема состоит в том, что любой структурный параллельный блок по определению имеет одну точку выхода, за которой обычно находится последовательный структурный блок. Вычисления в последовательном блоке, как правило, могут быть продолжены, если завершены все процессы в параллельном структурном блоке и их результаты корректно переданы в последовательный блок. Именно для обеспечения такой корректной передачи данных и необходима процедура синхронизации параллельных потоков.
В предшествующей лекции при изучении директив работы с циклами проблема синхронизации уже затрагивалась. Во-первых, было указано, что эта процедура является весьма трудоемкой и сопоставима с трудоемкостью инициализации параллельных потоков (т. е. эквивалентна примерно трудоемкости 1000 операций). Поэтому желательно пользоваться синхронизацией как можно реже.
Во-вторых, было отмечено, что неявно (по умолчанию) синхронизация параллельных процессов обеспечивается при выполнении циклов в параллельном режиме. Была упомянута директива nowait для устранения неявной синхронизации при завершении циклов. Однако пользоваться этой директивой следует весьма и весьма аккуратно, предварительно проанализировав порядок работы программы и убедившись, что отмена синхронизации не приведет к порче данных и непредсказуемым результатам.
Механизм работы синхронизации можно описать следующим образом. При инициализации набора параллельных процессов в программе устанавливается контрольная точка (аналогичная контрольной точке в отладчике), в которой программа ожидает завершения всех порожденных параллельных процессов. Отметим, что пока все параллельные процессы свою работу не завершили, программа не может продолжить работу за точкой синхронизации. А поскольку все современные высокопроизводительные процессоры являются процессорами конвейерного типа, становится понятной и высокая трудоемкость процедуры синхронизации. В самом деле, пока не завершены все параллельные процессы, программа не может начать подготовку загрузки конвейеров процессоров. Вот это-то и ведет к большим потерям при синхронизации процессов, аналогичных потерям при работе условных операторов в обычной последовательной программе.
Всего в OpenMP существует шесть типов синхронизации:
critical,
atomic,
barrier,
master,
ordered,
flush.
Далее подробно рассмотрим эти типы.