Открытый стандарт Open MP

Содержание

Слайд 2

Хотим все, сразу и бесплатно Программисты всегда мечтали, что в их

Хотим все, сразу и бесплатно

Программисты всегда мечтали, что в их программы

параллелизм проберется сам, незаметно и не отвлекая их от более важных дел.
Слайд 3

OpenMP Открытый стандарт OpenMP Architecture Review Board Windows, Linux, Mac OS X, Solaris «Учредители»:

OpenMP

Открытый стандарт OpenMP Architecture Review Board
Windows, Linux, Mac OS X, Solaris
«Учредители»:

Слайд 4

Поддержка OpenMP Microsoft Visual Studio 2005 и 2008 поддерживает OpenMP 2.0

Поддержка OpenMP

Microsoft Visual Studio 2005 и 2008 поддерживает OpenMP 2.0 в

редакциях Professional и Team System, 2010 - в редакциях Professional, Premium и Ultimate, 2012 - во всех редакциях.
GCC 4.2 поддерживает OpenMP
Intel C++ Compiler поддерживает версию OpenMP 3.0.
Слайд 5

Что такое OpenMP? Стандарт Библиотека времени выполнения Поддержка в компиляторе

Что такое OpenMP?

Стандарт
Библиотека времени выполнения
Поддержка в компиляторе

Слайд 6

Что такое OpenMP? OpenMP подразумевает маркировку параллельного кода специальными директивами. Параллелизация

Что такое OpenMP?

OpenMP подразумевает маркировку параллельного кода специальными директивами. Параллелизация происходит

«почти автоматически».
Паралелльные участки кода соседствуют с последовательными
1997 г – Fortran,
1998 г – C++
ЧУДО!!!
Слайд 7

OpenMP-программа Типичная схема Главный поток создает несколько вспомогательных и заставляет их считать задачу параллельно

OpenMP-программа

Типичная схема
Главный поток создает несколько вспомогательных и заставляет их считать задачу

параллельно
Слайд 8

Лучше один раз увидеть… double a[N], b[N], c[N]; int i; omp_set_dynamic(0);

Лучше один раз увидеть…

double a[N], b[N], c[N]; int i;
omp_set_dynamic(0);
omp_set_num_threads(10);
#pragma omp parallel

shared(a, b, c) private(i)
{
#pragma omp for
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
}
Слайд 9

Формат директив #pragma omp [directive] [clause [clause] …] [directive] – название

Формат директив

#pragma omp [directive] [clause [clause] …]
[directive] – название директивы
[clause] -

условие
Продление – «\» в конце
#pragma omp parallel private (i, j) \
shared (a, b, c)
Слайд 10

Подключение в C++ /openmp – флаг компилятору в VS

Подключение в C++

/openmp – флаг компилятору в VS

Слайд 11

Инкрементальный параллелизм Не нужно выкидывать старую программу и писать новую Можно

Инкрементальный параллелизм

Не нужно выкидывать старую программу и писать новую
Можно постепенно переписывать

код на использование параллельных вычислений
Слайд 12

Модель с разделяемой памятью Все потоки имеют доступ к глобальной разделяемой

Модель с разделяемой памятью

Все потоки имеют доступ к глобальной разделяемой памяти

(метка shared для переменных)
Приватные данные
доступны только
одному потоку
(метка private для
переменных)
Слайд 13

По умолчанию Все переменные shared общие, кроме: Индексов параллельных циклов Переменных, объявленных внутри параллельных регионов

По умолчанию

Все переменные shared общие, кроме:
Индексов параллельных циклов
Переменных, объявленных внутри параллельных

регионов
Слайд 14

Уровни параллельности SPMD MPMD MDMD

Уровни параллельности

SPMD
MPMD
MDMD

Слайд 15

Parallel Начинает параллельное выполнение блока в {} Создает “команду” потоков Количество

Parallel

Начинает параллельное выполнение блока в {}
Создает “команду” потоков
Количество потоков чаще всего

равняется количеству процессоров
После окончания блока количество потоков становится 1
Слайд 16

Параллельный регион Параллельный регион в OpenMP – блок кода, который исполняется всеми потоками параллельно.

Параллельный регион

Параллельный регион в OpenMP – блок кода, который исполняется всеми

потоками параллельно.
Слайд 17

Условный паралеллизм Если условие равно 0 параллельность не работает

Условный паралеллизм

Если условие равно 0 параллельность не работает

Слайд 18

For Без pragma parallel выполняется в один поток

For

Без pragma parallel выполняется в один поток

Слайд 19

Parallel for С pragma parallel выполняется в текущей «команде» потоков

Parallel for

С pragma parallel выполняется в текущей «команде» потоков

Слайд 20

Num_threads(N) Определяет количество потоков в «команде»

Num_threads(N)

Определяет количество потоков в «команде»

Слайд 21

Циклы, которые нельзя распараллелить Рекурсивные зависимости for (int i = 1;

Циклы, которые нельзя распараллелить

Рекурсивные зависимости
for (int i = 1; i <=

n; ++i)
a[i] = a[i-1] + b[i];
Например, числа Фибоначчи
Слайд 22

Зависимости Решение зависимостей: перегруппировка кода переписывание алгоритмов расстановка барьеров Если зависимости

Зависимости

Решение зависимостей:
перегруппировка кода
переписывание алгоритмов
расстановка барьеров
Если зависимости есть, но мы с ними

ничего не сделали, компилятор не будет спорить, а программа будет работать неверно
Слайд 23

Sheduling Static Dynamic Guided Auto

Sheduling

Static
Dynamic
Guided
Auto

Слайд 24

Ordered Код внутри ordered выполняется в установленном циклом последовательности

Ordered

Код внутри ordered выполняется в установленном циклом последовательности

Слайд 25

collapse Используется для вложенных циклов

collapse

Используется для вложенных циклов

Слайд 26

Sections Определяют, что должно быть параллельным Work1, Work2 + Work3 and

Sections

Определяют, что должно быть параллельным
Work1, Work2 + Work3 and Work4 –

выполняются паралелльно, но Work2 + Work3 выполняются последовательно
Слайд 27

Atomic Определяет атомарную операцию

Atomic

Определяет атомарную операцию

Слайд 28

critical Гарантирует выполнение участка кода только одним потоком

critical

Гарантирует выполнение участка кода только одним потоком

Слайд 29

Типы переменных Private –копия переменной shared

Типы переменных

Private –копия переменной
shared

Слайд 30

Private, firstprivate K kx

Private, firstprivate

K
kx

Слайд 31

reduction Совмещает private, shared, и atomic Вначале блока копирует значение shared

reduction

Совмещает private, shared, и atomic
Вначале блока копирует значение shared переменной
В конце

блока возвращается в переменную указанным оператором