Похожие презентации:
Лекция 4. Параллельное программирование для ресурсоёмких задач численного моделирования в физике
1. Параллельное программирование для ресурсоёмких задач численного моделирования в физике
Центр компьютерной физикиКафедра общей физики и волновых процессов
Лаборатория Инженерной Физики
Параллельное программирование
для ресурсоёмких задач численного
моделирования в физике
В.О. Милицин, Д.Н. Янышев, И.А. Буткарев
2.
23. Содержание лекции
Основные принципы OpenMP(продолжение)
Разделение работы (work-sharing constructs)
Синхронизация в OpenMP
Дополнительные возможности OpenMP
3
4. Принцип организации
Принцип организацииИспользование потоков (общее адресное пространство)
Пульсирующий (fork-join) параллелизм
Главный поток по мере необходимости инициирует
параллельные потоки
Параллелизм включается в обычную последовательную
программу, которая сохраняет свою работоспособность в
обычном режиме
4
5. Разделение работы (work-sharing constructs)
Do/for - распараллеливание циклов (параллелизм данных)Sections - функциональное распараллеливание
Single - директива для указания последовательного
выполнения кода
Физический факультет МГУ им М.В.Ломоносова
5
6. Конструкции do/for
C/C++#pragma omp for [clause ...]
for_loop
FORTRAN
c$omp do [clause ...]
do loop
[c$omp do [nowait]]
По умолчанию в конце цикла реализуется функция barrier (барьер)
Для отмены функции barrier следует воспользоваться предложением
nowait
Здесь в качестве предложения возможны следующие конструкции
schedule (type [,chunk])
ordered
private (list)
firstprivate (list)
lastprivate (list)
shared (list)
reduction (operator: list)
nowait
Физический факультет МГУ им М.В.Ломоносова
Пример
6
7. Предложение schedule ( type, [ chunk] )
static – итерации делятся на блоки по chunk итераций и статическиразделяются между потоками; если параметр chunk не определен,
итерации делятся между потоками равномерно и непрерывно
dynamic – распределение итерационных блоков осуществляется
динамически (по умолчанию chunk=1)
guided – размер итерационного блока уменьшает экспоненциально
при каждом распределении; chunk определяет минимальный
размер блока (по умолчанию chunk=1)
runtime – правило распределения определяется переменной
OMP_SCHEDULE (при использовании runtime параметр chunk
задаваться не должен)
Физический факультет МГУ им М.В.Ломоносова
7
8. Пример schedule ( static )
В этом случае петли цикла линейно распределяются между потокамипо следующей схеме
Физический факультет МГУ им М.В.Ломоносова
8
9. Пример schedule ( static , chunk )
В этом случае петли цикла распределяются между потокамипорциями размера chunk по следующей схеме
Физический факультет МГУ им М.В.Ломоносова
9
10. Пример schedule ( dynamic , chunk )
Вся загрузка делиться напорции размера chunk
По умолчанию chunk=1
Каждая очередная порция
загружается в очередной
освободившийся поток
Физический факультет МГУ им М.В.Ломоносова
10
11. Пример schedule ( guided , chunk )
Пример schedule ( guided , chunk )Этот режим загрузки данных в поток работает также как и
dynamic, но размер данных определяется динамически,
не превосходя размер chunk
При этом обеспечивается достаточно сбалансированная
загрузка потоков с небольшими задержками при
завершении параллельной обработки
Физический факультет МГУ им М.В.Ломоносова
11
12. Тип schedule ( runtime [ , chunk ] )
В этом случае загрузка порций данных по потокамопределяется значением переменной окружения
OMP_SCHEDULE
Значение этой переменной проверяется перед каждой
загрузкой
По умолчанию оно имеет значение static
chunk определяет размер порции данных загружаемых в поток
Примеры задания переменной окружения
$ export OMP_SCHEDULE=static, 1000
$ export OMP_SCHEDULE=dynamic
Физический факультет МГУ им М.В.Ломоносова
12
13. Директивное предложение reduction
Директивное предложение reductionreduction (operator|intrinsic:var1[,var2])
определяет список переменных, для которых выполняется
операция редукции (должна быть числовая)
В FORTRAN допустимы следующие операции и функции
operator может быть +, -, *, .and., .or., .eqv., .neqv.
intrinsic может быть max, min, iand, ior, ieor
В С допустимы следующие операции и функции
operator может быть +, -, *, &, ^, &&, ||
указатели и ссылки в предложениях reduction применять нельзя
Физический факультет МГУ им М.В.Ломоносова
13
14. Примеры реализации предложения reduction
В каждом потоке определяетсяпеременная sum для частичных сумм
После завершения всех потоков
частичные суммы добавляются к
глобальной переменной sum
В каждом потоке вычисляются
частичные минимумы по значениям, в
соответствующем потоке
После завершения параллельного
блока вычисляется минимум gmin по
значениям частичных минимумов
Физический факультет МГУ им М.В.Ломоносова
14
15. Конструкция sections
Конструкция sectionsC/C++
#pragma omp sections [clause ...]
{
#pragma omp section
structured_block
[#pragma omp section
structured_block
…]
}
FORTRAN c$omp sections [clause ...]
c$omp section
structured_block
[c$omp section
structured_block
…]
c$omp end sections [nowait]
каждый фрагмент выполняется однократно
разные фрагменты выполняются разными потоками
завершение директивы по умолчанию синхронизируется
директивы section должны использоваться только в статическом
контексте
Здесь в качестве предложения возможны следующие конструкции
private (list)
firstprivate (list)
lastprivate (list)
reduction (operator: list)
nowait
Физический факультет МГУ им М.В.Ломоносова
15
16. Пример конструкции sections
Каждая параллельнаясекция выполняется в
параллельном потоке
Реализуется
функциональная
декомпозиция
Неявно в конце section
реализуется операция barrier
(для ее подавления следует
использовать предложение
nowait)
Физический факультет МГУ им М.В.Ломоносова
16
17. Конструкция single
C/C++#pragma omp single [clause ...]
structured_block
FORTRAN c$omp single [clause ...]
structured_block
c$omp end single [nowait]
определение фрагмента кода, который должен быть
выполнен только одним потоком
все остальные потоки ожидают завершения выполнения
фрагмента (если не указан параметр nowait)
Здесь в качестве предложения возможны следующие
конструкции
private (list)
firstprivate (list)
Физический факультет МГУ им М.В.Ломоносова
17
18. Пример конструкции single
Конструкция single используетсядля выполнения блока
программы в параллельном
режиме только в одном потоке
Эта конструкция эквивалентна
конструкции section, но имеет
более простой синтаксис
Для предотвращения неявного
выполнения операции barrier
следует использовать
предложение nowait
Физический факультет МГУ им М.В.Ломоносова
18
19. Пример конструкции single nowait
#pragma omp parallelfor(Iterator i = list.begin(); i != list.end(); ++i )
{
#pragma omp single nowait
SomeLongAction(*i);
}
итератор будет в каждом потоке свой
функция SomeLongAction будет выполнена для каждого
элемента списка единожды
приводит к большой дополнительной синхронизации
Рекомендуемый минимальный размер последовательного
задания 10000 инструкций
Физический факультет МГУ им М.В.Ломоносова
19
20. Использование опции nowait
Использование опции nowait#pragma omp for nowait
for (i=0; i<N; i++)
b[i] = f(a[i]);
#pragma omp for nowait
for (i=0; i<N; i++)
c[i] = g(a[i]);
Физический факультет МГУ им М.В.Ломоносова
#pragma omp for nowait
for (i=0; i<N; i++)
b[i] = f(a[i]);
#pragma omp for nowait
for (i=0; i<N; i++)
c[i] = g(b[i]);
20
21. Совместимость директив и их параметров
Физический факультет МГУ им М.В.Ломоносова21
22. Синхронизация в OpenMP
Типы синхронизации в OpenMPcritical
atomic
barrier
master
ordered
flush
22
23. Синхронизация в OpenMP: тип critical
Поток описанный как criticalsection выполняется в
монопольном режиме процессора
Синтаксис
C/C++
#pragma omp critical [ (name) ]
structured_block
FORTRAN
!$omp critical [ (name) ]
structured_block
!$omp end critical [ (name) ]
Разные критические секции
независимы, если они имеют
разные имена
Не поименованные критические
секции относятся к одной и той же
секции
23
24. Синхронизация в OpenMP: тип atomic
Предотвращает прерывания доступа, чтения и записи данных,находящихся в общей памяти, со стороны других потоков
Синтаксис
C/C++
#pragma omp atomic
statement
FORTRAN
!$omp atomic
statement
Является альтернативой reduction
Применяется только к переменной в левой части оператора
присваивания следующего непосредственно за описанием
Дорогая операция с точки зрения временных затрат при
выполнении программы (но быстрее critical). Использование
рационально при относительно редком обращении к общим
переменным
24
25. Синхронизация в OpenMP: тип barrier
Устанавливает режим ожидания завершенияработы всех потоков по достижению barrier
Синтаксис
C/C++
#pragma omp barrier
FORTRAN
!$omp barrier
25
26. Синхронизация в OpenMP: тип master
В этом случае следующий за описанием блоквыполняется только в главном потоке. Остальные
потоки обходят этот блок без неявного режима barrier
Синтаксис
C/C++
#pragma omp master
structured_block
FORTRAN
!$omp master
structured_block
!$omp end master
26
27. Синхронизация в OpenMP: тип ordered
В этом случае в следующем за описанием блоке циклывыполняются в порядке, как в последовательной
программе
Синтаксис
C/C++
#pragma omp ordered
structured_block
FORTRAN
!$omp ordered
structured_block
!$omp end ordered
int* arr = new int[10];
for(int i = 0; i < 10; i++)
arr[i] = i;
#pragma omp parallel for ordered
for (int i = 1; i < 10; i++)
{
#pragma omp ordered
arr[i] = arr[i - 1];
}
for(int i = 0; i < 10; i++)
printf("\narr[%d] = %d", i, arr[i]);
27
28. Синхронизация в OpenMP: тип flush
В этом случае значения всех общих переменных потоков должны быть“сброшены” в память
Синтаксис
C/C++
#pragma omp flush(var1 [, var2]…)
FORTRAN
!$omp flush(var1 [, var2]…)
28
29. Дополнительные возможности
2930. Миграция данных с помощью директивы threadprivate в Fortran
Директива threadprivate позволяетсохранять данные параллельных
потоков на протяжении всей
программы
Для этого необходимо поместить
переменные в common блок, а
затем описать этот блок с
помощью директивы threadprivate
В процессе миграции сохраняется
соответствие между значениями
мигрирующих переменных и
номерами потоков
Синтаксис
FORTRAN
!$omp threadprivate (/cb/[,/cb2/…])
30
31. Миграция данных с помощью директивы threadprivate в С/С++
Миграция данных с помощью директивыthreadprivate в С/С++
Синтаксис
С/С++
#pragma omp threadprivate (cb1 [, cb2]…)
Элементами списка не могут быть
ссылки или переменные не
полностью определенные, а также
адреса констант
Нельзя использовать элементы
списка в всех директивах OpenMP
кроме copyin, schedule и if
Нельзя использовать threadprivate
в динамическом режиме работы
программы
31
32. Передача данных при миграции - copyin
С помощью выражения copyinможно просто передавать
данные из главного потока в
параллельный
Синтаксис
C/C++
copyin (var1 [,var2]…)
FORTRAN
copyin (/cb/[,/cb2/…])
На FORTRAN в copyin задаются
имена common блоков, в
которых описаны
мигрирующие переменные, а в
С/C+ - имена самих
переменных
32
33. Пример передачи данных
float* work;int size;
float val;
#pragma omp threadprivate(work,size,val)
void build_work()
{
int i;
work = (float*)malloc( sizeof(float)*size );
for( i = 0; i < size; ++i ) work[i] = val;
}
Значение каждой threadprivateпеременной из списка
устанавливается равным
значению этой переменной в
master-нити
int main()
{
read_from_file (val, size);
#pragma omp parallel copyin(val,size)
build_work();
}
Физический факультет МГУ им М.В.Ломоносова
33
34. Дополнительные возможности OpenMP: функции блокировки
Дополнительные возможности OpenMP:функции блокировки
C/C++
void omp_init_lock(omp_lock_t *lock) – блокирует объект с
указателем lock
void omp_destroy_lock(omp_lock_t *lock) – гарантирует, что
объект с указателем lock не инициализирован
void omp_set_lock(omp_lock_t *lock) – блокирует выполнение
потока до тех пор, пока объект открыт для операций чтения или
записи, после их завершения блокирует объект и продолжает
выполнение потока
void omp_unset_lock(omp_lock_t *lock) – открывает
заблокированный объект
int omp_test_lock(omp_lock_t *lock) – пытается заблокировать
объект не прерывая выполнения потока (возвращает TRUE или
ненулевое значение, если попытка завершилась успешно, в
противном случае возвращает 0)
необходимо включение #include <omp.h>
FORTRAN
subroutine omp_init_lock(omp_lock_t lock)
subroutine omp_destroy_lock(omp_lock_t lock)
subroutine omp_set_lock(omp_lock_t lock)
subroutine omp_unset_lock(omp_lock_t lock)
logical omp_test_lock(omp_lock_t *lock)
переменная lock должна быть целочисленной типа KIND и иметь
размерность достаточную для записи адреса
34
35. OpenMP 3.1
Концепция задачtask
taskwait
Вложенный параллелизм
Области действия internal control variables (ICVs)
Добавлена max-active-levels-var ICV
…
…
См. http://www.openmp.org/mp-documents/OpenMP3.1.pdf
http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf
35
36. OpenMP 4.0
Векторизацияявная векторизация циклов: simd
комбинация с for (#pragma omp parallel for simd)
…
Гибридные системы (ускорители, GPU, …)
target
teams, distribute
…
Привязка потоков (Thread affinity: parallel proc_bind, …)
Task enhancements (cancel, taskgroup, …)
…
См. http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf
http://openmp.org/mp-documents/OpenMP-4.0-C.pdf
36
37.
Физический факультет МГУ им М.В.Ломоносова37