Похожие презентации:
Синхронизация. Основы OpenMP. Семинар 10
1.
Семинар 10Синхронизация
Основы OpenMP
2.
Цель и задачиЦелью семинара является изучение базовых механизмов синхронизации
средствами OpenMP.
Задачи:
Необходимо провести анализ примеров, демонстрирующих различные
методы синхронизации и того, что может получиться при отсутствии
синхронизации.
3.
OpenMPБиблиотека для параллельного программирования
4.
OpenMPOpenMP — это библиотека для параллельного программирования
вычислительных систем с общей памятью.
Официально поддерживается Си, С++ и Фортран
Библиотека активно развивается, в настоящий момент актуальный
стандарт версии 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.
Директива barrier13.
Разделение задачмежду потоками
Параллельный цикл
Параллельные задачи
Параллельные секции
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.
Использовать свои данные, изменив в программе функцию,
используемую для интегрирования и интервалы интегрирования.
Три варианта запуска с разными интервалами