301.14K
Категория: ПрограммированиеПрограммирование

Синхронизация. Основы OpenMP. Семинар 10

1.

Семинар 10
Синхронизация
Основы OpenMP

2.

Цель и задачи
Целью семинара является изучение базовых механизмов синхронизации
средствами OpenMP.
Задачи:
Необходимо провести анализ примеров, демонстрирующих различные
методы синхронизации и того, что может получиться при отсутствии
синхронизации.

3.

OpenMP
Библиотека для параллельного программирования

4.

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

5.

Идеология OpenMP
Библиотека OpenMP подходит только для программирования систем
с общей памятью, при этом используется параллелизм потоков.
Для использования библиотеки OpenMP вам необходимо подключить
заголовочный файл "omp.h", в а также добавить опцию сборки -fopenmp
(gcc) или установить соответствующий флажок в настройках проекта
(Visual Studio).

6.

Директива omp parallel
После запуска программы
создается единственный процесс
Встретив #pragma omp parallel
процесс порождает ряд потоков
Границы параллельной области
выделяются фигурными
скобками.
В конце области потоки
уничтожаются.

7.

Синхронизация
Критические секции, atomic, barrier

8.

Директива critical
Все переменные, созданные до директивы parallel являются
общими для всех потоков.
Переменные, созданные внутри потока являются локальными
(приватными) и доступны только текущему потоку.
При изменении общей переменной одновременно несколькими
потоками возникает состояние гонок — это проблема и допускать
такое нельзя.

9.

10.

Директива atomic
Для ряда операций более эффективно использовать директиву atomic.
Применять ее можно для операций префиксного/постфиксного
инкремента/декремента и операции типа X BINOP = EXPR,
где BINOP +, *, -, /, &, ^, |, <<, >>

11.

Имя секции должно
подсказывать
программисту
к какому виду ресурса
она относится —
например (cout).
Запустив программу раз 20 мне удалось
получить на экране не только 125 125, но и 124 125

12.

Директива barrier

13.

Разделение задач
между потоками
Параллельный цикл
Параллельные задачи
Параллельные секции

14.

Параллельный цикл

15.

Параллельный цикл
Самый популярный способ распределения задач в OpenMP —
параллельный цикл.
Вычисление суммы элементов массива

16.

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

17.

Разделяемые переменные
Поток может использовать как локальные переменные, так и
разделяемые.
Разделяемые переменные (shared) являются общими для всех
потоков
Все константы являются разделяемыми — в нашем примере,
разделяемыми являются переменные «a» и «n».
Все переменные, объявленные внутри параллельной области
являются локальными (переменная «i» в нашем примере).

18.

Опция reduction
Задает локальную переменную (sum), а также, операцию,
которая будет выполнена над локальными переменными при
выходе из параллельной области («+»).
Начальное значение локальных переменных, в этом случае,
определяется типом операции (для аддитивных операций —
ноль, для мультипликативных — единица).

19.

20.

Директива for
В пятой строке примера задается начало параллельного цикла.
Итерации цикла, следующего за соответствующей директивой
будут распределены между потоками.
Директива for имеет множество опций, подробнее про которые
можно прочитать в толстых учебниках))
Внутри цикла можно задать опции private и firstprivate, но кроме
того, ряд новых.
Например schedule определяет способ распределения итераций
между потоками, а nowait — убирает неявную барьерную
синхронизацию, которая по умолчанию стоит в конце цикла.

21.

Параллельные задачи

22.

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

23.

Директива omp task
различий между этими фрагментами нет, результат
работы у них может быть одинаковый

24.

Директива taskwait
Поток не будет выполнять код,
размещенный после taskwait
до тех пор, пока не будут выполнены
все созданные этим потоком задачи.
В строке 2 порождаются потоки.
Каждый поток помещает в пул
задачу (строки 4-7)
Выводит на экран слово «world»
(строка 8)
Ожидает завершения задачи
(строка 9)
Выводит на экран слово «bye»
(строка 10)

25.

Таким образом, каждый поток гарантированно выведет по очереди слова
«world», «hello», «bye», но т.к. параллельно работает несколько потоков,
на экране может быть смазанная картина

26.

Директива omp single
Выделяет блок операторов, который
будет выполнен лишь одним потоком

27.

Параллельные секции

28.

Рассмотрим аналогию
Механизм параллельных секций видится мне достаточно
низкоуровневым. Тем не менее, он полезен в ряде случаев.
Как было отмечено выше, параллельный цикл можно применять
только в случаях, если итерации цикла не зависят друг от друга,
т.е. тут нельзя:

29.

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

30.

Многопоточный вывод
"Hello World"

31.

Использование
критической секции
Шаг 1
Шаг 2
Шаг 3

32.

Вычисление интеграла с
использованием
редукции

33.

Домашнее задание
Установить на домашней системе openMP и прислать отчет
(в виде сканов) демонстрирующих выполнение программы
вычисления интеграла с использованием openMP.
Использовать свои данные, изменив в программе функцию,
используемую для интегрирования и интервалы интегрирования.
Три варианта запуска с разными интервалами
English     Русский Правила