140
МОЛОДЕЖНАЯ ШКОЛА «Суперкомпьютерные технологии в науке, промышленности и образовании» ННГУ им. Н.И. Лобачевского, Нижний Новгород, 26-31 октября 2009 г. КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ Курс : Введение в параллельные алгоритмы Якобовский Михаил Владимирович д.ф.-м.н., зав. сектором, Институт математического моделирования РАН, Москва

якобовский - введение в параллельное программирование (1)

Embed Size (px)

Citation preview

Page 1: якобовский - введение в параллельное программирование (1)

МОЛОДЕЖНАЯ ШКОЛА«Суперкомпьютерные технологии

в науке, промышленности и образовании»

ННГУ им. Н.И. Лобачевского, Нижний Новгород, 26-31 октября 2009 г.

КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ

Курс: Введение в параллельные алгоритмы

Якобовский Михаил Владимировичд.ф.-м.н., зав. сектором, Институт математического моделирования РАН, Москва

Page 2: якобовский - введение в параллельное программирование (1)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности»

Содержание

• Введение• Постановка проблемы• Основные понятия• Базовые методы• Сумма ряда• Параллельная сортировка • Выводы• Контрольные вопросы• Литература

2 из N

Page 3: якобовский - введение в параллельное программирование (1)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности»

Постановка проблемы• Вычислительная мощность суперкомпьютеров быстро растет• Примеров успешного полноценного использования

суперкомпьютеров мало• В среднем вычислительная мощность суперкомпьютеров

используется не более, чем на несколько процентов

• Необходима разработка алгоритмической и программной базы, создание которой возможно исключительно на основе тесного взаимодействия специалистов прикладных областей и специалистов в области создания параллельных приложений

3 из N

Page 4: якобовский - введение в параллельное программирование (1)

Введение

• Курс знакомит с некоторыми принципами разработки параллельных алгоритмов. Из всего многообразия причин, побуждающих к использованию суперкомпьютеров, в рамках курса рассматриваются только две:– сокращение времени решения прикладных

задач– обеспечение возможности решения больших

задач за заданное время

4

Page 5: якобовский - введение в параллельное программирование (1)

Кризис эффективности

• Вычислительная мощность суперкомпьютеров велика, но: – Она образована суммой мощностей множества

исполнительных устройств• На протяжении ряда лет увеличение

производительность компьютера автоматически означало снижение времени работы существующих программ. Теперь это не так:– Последовательные программы не могут

работать на многопроцессорных системах быстрее, чем на последовательных

5

Page 6: якобовский - введение в параллельное программирование (1)

Кризис эффективности

• Время вычислительных систем, обладающих существенной производительностью и имеющих в своем составе только один процессор прошло

• Автоматическое преобразование последовательных программ в параллельные невозможно

• Необходимо знать существующие и развивать новые методы решения задач на многопроцессорных системах

6

Page 7: якобовский - введение в параллельное программирование (1)

Уточнение круга рассматриваемых систем

• Системы на основе объединенных сетью типовых вычислительных узлов – системы с распределенной оперативной памятью

• Системы с доступом всех процессоров к общей оперативной памяти

• Графические ускорители• ПЛИС• Нейрокомпьютеры• Другие …

7

Page 8: якобовский - введение в параллельное программирование (1)

Многопроцессорные системы с распределенной памятью

Процессор 1 Процессор 2 Процессор 3

ЛокальнаяПамять 1

ЛокальнаяПамять 2

ЛокальнаяПамять 3

Router2

Router1

P-Nodes

IO-Nodes

Network концентраторы

Процессорные узлы

8

Page 9: якобовский - введение в параллельное программирование (1)

Многопроцессорные системы с общей памятью

Процессор 1 Процессор 2 Процессор 3

Общая оперативная память

9

Page 10: якобовский - введение в параллельное программирование (1)

Гибридные вычислительные системы

10

Процессор 1 Процессор 2 Процессор 3

Общая оперативная память

Процессор 7

Процессор 8

Процессор 9

Общая оперативная память

Процессор 4

Процессор 5

Процессор 6

Общая оперативная память

сеть

Page 11: якобовский - введение в параллельное программирование (1)

Уточнение круга рассматриваемых алгоритмов

• Слабо взаимодействующие последовательные процессы

11

Page 12: якобовский - введение в параллельное программирование (1)

• При запуске указываем число требуемых процессоров Np и название программы

• На выделенных для расчета узлах запускается Np копий указанной программы

– Например, на двух узлах запущены три копии программы. Копия программы с номером 1 не имеет непосредственного доступа к оперативной памяти копий 0 и 2:

• Каждая копия программы получает два значения: – Np– rank из диапазона [0 … Np-1]

• Любые две копии программы могут непосредственно обмениваться данными с помощью функций передачи сообщений

Модель программы на распределенной памяти

0 1 2

12

Page 13: якобовский - введение в параллельное программирование (1)

• Работа начинается с запуска одной программы• При необходимости программа порождает новые процессы,

эти процессы:– Обладают собственными локальными переменными– Имеют доступ к общим глобальным переменнымint a_global; main нить1 нить2main(){int b1_local; запуск нити1} запуск нити2 fun()

{int b2_local; ожидание} окончания работы

Модель программы на общей памяти

13

Page 14: якобовский - введение в параллельное программирование (1)

Свойства канала передачи данныхT(n)=n*Tбайта+ Tлатентности

Число передаваемых байт

Infiniband

14

Page 15: якобовский - введение в параллельное программирование (1)

• Синхронный методSend(адрес данных, размер, номер процессора)Recv(адрес данных, размер, номер процессора)

• Асинхронные методы– НебуферизованныйASend(адрес данных, размер, номер процессора)ARecv(адрес данных, размер, номер процессора)ASync

– БуферизованныйABSend(адрес данных, размер, номер процессора)

Методы передачи данных

15

Page 16: якобовский - введение в параллельное программирование (1)

• A=3• Send(&A)• A=5

Синхронный

B=4 Recv(&B) Print(B)

SendRecv

Print(B)A=5

B=4A=3

Результат3

16

Page 17: якобовский - введение в параллельное программирование (1)

• A=3• АSend(&A)• A=5

Асинхронные

B=4 АRecv(&B) Print(B)

Send

ASend

Recv

ARecv

Print(B)A=5

B=4

Результат 3 ? 4 ? 5

A=3

17

Page 18: якобовский - введение в параллельное программирование (1)

• A=3• АSend(&A)• Async()• A=5

Асинхронные B=4 АRecv(&B) Print(B)

ASync

Send

ASend

Recv

ARecv

Print(B)

A=5

B=4

Результат 3 ? 4

A=3

18

Page 19: якобовский - введение в параллельное программирование (1)

• A=3• АSend(&A)• Async()• A=5

Асинхронные B=4 АRecv(&B) Async() Print(B)

Результат

3

ASync

SendASend

ASyncRecv

ARecv

Print(B)A=5

A=3B=4

19

Page 20: якобовский - введение в параллельное программирование (1)

• A=3• АBSend(&A)• A=5

Асинхронные буферизованные

B=4 АRecv(&B) Async() Print(B)

Результат 3

Send(&buf)

ABSend

ASyncRecv

ARecv

Print(B)

A=5

buf=A

A=3

B=4

20

Page 21: якобовский - введение в параллельное программирование (1)

• Целочисленная неотрицательная переменная • Две атомарные операции, не считая

инициализации• V(S)

– Увеличивает значение S на 1

• P(S)– Если S положительно, уменьшает S на 1– Иначе ждет, пока S не станет больше 0

Семафор

Языки програмирования. Редактор Ф.Женюи. Перевод с англ В.П.Кузнецова. Под ред. В.М.Курочкина. М:."Мир", 1972 Э. Дейкстра. Взаимодействие последовательных процессов.

http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/ewd123/index.html 21

Page 22: якобовский - введение в параллельное программирование (1)

ускорениепараллельного

алгоритма

S(p)=T(1)/T(p)

Ускорение и эффективность параллельных алгоритмов

Ускорение параллельного алгоритма относительно

наилучшего последовательного

S*(p)=T * /T(p)E *(p)=S *(p)/p

эффективностьиспользования

процессорной мощности

E(p)=S(p)/p

22

Page 23: якобовский - введение в параллельное программирование (1)

• Да, если:– Сравниваем с плохим последовательным

алгоритмом– Аппаратные особенности вычислительной

системы косвенно влияют на эффективную скорость обработки данных

Может ли быть S(p)>p ?

23

Page 24: якобовский - введение в параллельное программирование (1)

• Да– Если первый алгоритм позволяет использовать

больше процессоров, чем второй.

• Самый эффективный алгоритм – использующий один (1) процессор. – Его эффективность по определению равна

100%, но он не всегда самый быстрый.

Может ли неэффективный алгоритм работать быстрее эффективного?

24

Page 25: якобовский - введение в параллельное программирование (1)

• Все элементарные операции (+ - * / ) выполняются за время с

• Все операции выполняются точно, результат не зависит от порядка их выполнения

Определить сумму конечного ряда

25

Page 26: якобовский - введение в параллельное программирование (1)

S=1;a=1;for(i=1;i<= n;i++){

a=a*x/i;S=S+a;

}

Последовательный алгоритм

T1= 3nс

26

Page 27: якобовский - введение в параллельное программирование (1)

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

• Вычислить для всех i =1,…,n : xi

• Вычислить для всех i =1,…,n : i!

• Вычислить для всех i =1,…,n : ai =

• Вычислить сумму всех членов ai

27

Page 28: якобовский - введение в параллельное программирование (1)

Для вычисления xi воспользуемся методом бинарного умножения

x

1 x2

2 x3 x4

3 x5 x6 x7 x8

4 x9 x10 x11 x12 x13 x14 x15 x16

xi

28

Page 29: якобовский - введение в параллельное программирование (1)

Для вычисления i! воспользуемсяаналогичным методом

4 12 34 56 78910 1112 1314 1516=16!

3 12 34 56 78 910 1112 1314 1516

2 12 34 56 78 910 1112 1314 1516

1 12 34 56 78 910 1112 1314 1516

16!

29

Page 30: якобовский - введение в параллельное программирование (1)

Для вычисления i! воспользуемсяаналогичным методом

4 12 34 56 78910 1112 =12!

3 12 34 56 78 910 1112 1314 1516

2 12 34 56 78 910 1112 1314 1516

1 12 34 56 78 910 1112 1314 1516

12!

30

Page 31: якобовский - введение в параллельное программирование (1)

Для вычисления i! воспользуемсяаналогичным методом

4 12 34 56 78910 1112 1314=14!

3 12 34 56 78 910 1112 1314

2 12 34 56 78 910 1112

1 12 34 56 78 910 1112 1314 1516

14!

31

Page 32: якобовский - введение в параллельное программирование (1)

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

• Вычислить все xi :

• Вычислить все i! :• Вычислить все ai : - надо n процессоров

• Вычислить сумму всех ai :

a1 a2 a3 a4 a5 a6 a7 a8 a1+a2 a3+a4 a5+a6 a7+a8

a1+a2+a3+a4 a5+a6+a7+a8

a1+a2+a3+a4+a5+a6+a7+a8

2

32

Page 33: якобовский - введение в параллельное программирование (1)

p=n

Ускорение и эффективность при p=n

21.5

1.5

33

Page 34: якобовский - введение в параллельное программирование (1)

Методы построения параллельных алгоритмов

… если для нас представляют интерес реально работающие системы, то требуется убедиться, (и убедить всех сомневающихся) в корректности наших построений

… системе часто придется работать в невоспроизводимых обстоятельствах, и мы едва ли можем ожидать сколько-нибудь серьезной помощи от тестов

Dijkstra E.W.1966

34

Page 35: якобовский - введение в параллельное программирование (1)

• Методы построения параллельных алгоритмов и их свойства:– Статическая балансировка

• метод сдваивания• геометрический параллелизм• конвейерный параллелизм

– Динамическая балансировка• коллективное решение• диффузная балансировка загрузки

Огласите весь список, пожалуйста! «Напарник», Леонид Гайдай

35

Page 36: якобовский - введение в параллельное программирование (1)

• Обладает запасом внутреннего параллелизма– Есть возможность одновременного выполнения

операций

• Допускает возможность равномерного распределения вычислительных операций между процессорами

• Обладает низким уровнем накладных расходов

Хороший параллельный алгоритм

большим

большим числом

36

Page 37: якобовский - введение в параллельное программирование (1)

• Операции, отсутствующие в наилучшем последовательном алгоритме:– Синхронизация– Обмен данными– Дублирование операций– Новые операции

Накладные расходы

37

Page 38: якобовский - введение в параллельное программирование (1)

• Потери времени на передачу данных между процессами

Процессор 1 Процессор 2

Обмен данными

38

Page 39: якобовский - введение в параллельное программирование (1)

• Потери времени на ожидание долго выполняющихся процессов Процессор 1 Процессор 2 Процессор 3

Синхронизация

39

Page 40: якобовский - введение в параллельное программирование (1)

S=0;For(i=0;i<n1;i++) S+=a[i];Send(S)

Дублирование операций

S=0;For(i=n1;i<n;i++) S+=a[i];Send(S)

Recv(S1)Recv(S2)S=S1+S2

40

Page 41: якобовский - введение в параллельное программирование (1)

127

)8(

437

log1

log)(

4

482

22/

nE

pn

nS

nnT

p

pn

cnp

Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4

1 12 34 56 78

2 123 1234 567 5678

3 12345 123456 1234567 12345678

Новые операции

F=1;

for(i=2;i <= n;i++)

F*=i;

)1()(1 nnT c

Вычисление всех факториалов до 8! включительно

41

Page 42: якобовский - введение в параллельное программирование (1)

127

)8(437

log1

log)( 4

482

22/

nEpn

nSnnT p

pn

cnp

Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4

1 12 34 56 78

2 123 1234 567 5678

3 12345 123456 1234567 12345678

Новые операции

Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4

1 2! 34 56 78

2 3! 4! 567 5678

3 5! 6! 7! 8!

1

2

4

3

8

5

9

11

6 7

12

10

42

Page 43: якобовский - введение в параллельное программирование (1)

• Каскадная схема

• Модифицированная каскадная схема

Метод сдваивания

a1 a2 a3 a4 a5 a6 a7 a8 a1+a2 a3+a4 a5+a6 a7+a8

a1+a2+a3+a4 a5+a6+a7+a8

a1+a2+a3+a4+a5+a6+a7+a8

n

nEn

nnS

nnT

npnp

cnp

22/

22/

22/

log1

)(log

1)(

log)(

21

)(log2

1)(

log2)(

22

2

log2log

2

log

nEn

nnS

nnT

n

np

n

np

c

n

np

X 2 X

1 0 X 1 X

9 X 3 X

1 1 X 4 X

1 2 X 5 X

1 3 X 6 X

1 4 X 7 X

1 5 X 8 X

1 6

1

2

43

Page 44: якобовский - введение в параллельное программирование (1)

Стена Фокса

n – ширина стенык – высота стены

44

Page 45: якобовский - введение в параллельное программирование (1)

Одномерная разностная схема для уравнения диффузии

hNN

DNN

NN

nih

NNND

NNxN

DN

nnnn

iiiii

t

1

00

211

2

2

1,,1,2

1,,1,212 niNNNhD

NN iiiii

45

Page 46: якобовский - введение в параллельное программирование (1)

Решение одномерного уравнения на 9 моментов времени

0.0000

0.2000

0.4000

0.6000

0.8000

1.0000

1.2000

1 2 3 4 5 6 7 8 9 10 11

Ряд1

Ряд2

Ряд3

Ряд4

Ряд5

Ряд6

Ряд7

Ряд8

Ряд9

46

Page 47: якобовский - введение в параллельное программирование (1)

Метод геометрического параллелизма

c

sp

c

sp

scpc

np

knE

np

pknS

kp

knknTknknT

41

1)(

41

1)(

4)()(1

47

Page 48: якобовский - введение в параллельное программирование (1)

А почему?

for(шаг=0;шаг<k;шаг++)

{for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить(кирпич)

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank<p-1) Send(rank+1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

if(rank<p-1) Recv(rank+1, место готово? )

}

scp kp

knknT 4)(

48

Page 49: якобовский - введение в параллельное программирование (1)

?

0 1 2 3 4 5

=<

>==<

>==<

>==<

>==<

>=

scp kp

knknT 4)(

for(шаг=0;шаг<k;шаг++)

{for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить(кирпич)

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank<p-1) Send(rank+1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

if(rank<p-1) Recv(rank+1, место готово? )

}

49

Page 50: якобовский - введение в параллельное программирование (1)

?

0 1 2 3 4 5

=<

>==<

>==<

>==<

>==<

>=

scp kp

knknT 4)(

for(шаг=0;шаг<k;шаг++)

{for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить(кирпич)

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank<p-1) Send(rank+1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

if(rank<p-1) Recv(rank+1, место готово? )

}

50

Page 51: якобовский - введение в параллельное программирование (1)

?

0 1 2 3 4 5

=<

=<>=

=<>=

=<>=

=<>=

>=

scp kp

knknT 4)(

for(шаг=0;шаг<k;шаг++)

{for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить(кирпич)

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank<p-1) Recv(rank+1, место готово? )

if(rank<p-1) Send(rank+1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

}

51

Page 52: якобовский - введение в параллельное программирование (1)

?scp kp

knknT 4)(

0 1 2 3 4 5

=<

=<>=

=<>=

=<>=

=<>=

>=

52

Page 53: якобовский - введение в параллельное программирование (1)

!scp kp

knknT 1)(

0 1 2 3 4 5

=<

=<>=

=<>=

=<>=

=<>=

>=

53

Page 54: якобовский - введение в параллельное программирование (1)

!scp kp

knknT 2)(

0 1 2 3 4 5

=<

=<>=

=<>=

=<>=

=<>=

>=

54

Page 55: якобовский - введение в параллельное программирование (1)

!scp kp

knknT 3)(

0 1 2 3 4 5

=<

=<

>=

=<>=

=<>=

=<>=

>=

55

Page 56: якобовский - введение в параллельное программирование (1)

!scp kp

knknT 4)(

0 1 2 3 4 5

=<

=<

>=

=<

>=

=<>=

=<>=

>=

56

Page 57: якобовский - введение в параллельное программирование (1)

!scp pkp

knknT )(

0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

57

Page 58: якобовский - введение в параллельное программирование (1)

!scp kpp

knknT )1()(

0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

58

Page 59: якобовский - введение в параллельное программирование (1)

!0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

scp kpp

knknT )2()(

59

Page 60: якобовский - введение в параллельное программирование (1)

!0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

scp kpp

knknT )3()(

60

Page 61: якобовский - введение в параллельное программирование (1)

!0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

scp kpp

knknT )4()(

61

Page 62: якобовский - введение в параллельное программирование (1)

!0 1 2 3 4 5

=<

=<

>=

=<

>=

=<

>=

=<>=

>=

scp pkp

knknT 2)(

62

Page 63: якобовский - введение в параллельное программирование (1)

!0 1 2 3 4 5

=<

>==<

=<>=

>==<

=<>=

>=

scp pkp

knknT 4)(

63

Page 64: якобовский - введение в параллельное программирование (1)

!for(шаг=0;шаг<k;шаг++)

{

for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить(кирпич)

if(rank%2)

{

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

if(rank<p-1) Recv(rank+1, место готово? )

if(rank<p-1) Send(rank+1, кирпич уложен! )

}

else

{

if(rank<p-1) Recv(rank+1, место готово? )

if(rank<p-1) Send(rank+1, кирпич уложен! )

if(rank>0) Send(rank-1, кирпич уложен! )

if(rank>0) Recv(rank-1, место готово? )

}

}

scp kp

knknT 4)(

64

Page 65: якобовский - введение в параллельное программирование (1)

Метод коллективного решения (укладка паркета)

scp pN

T

s

cpmax

s

c

65

Page 66: якобовский - введение в параллельное программирование (1)

Метод коллективного решения (укладка паркета)

c

sr

p

s

cs

cr

p

scp

c

r

knE

p

pr

rknS

rrpkn

knT

knknT

s

c

s

c

1

1)(

11

1

1

1)(

)(

)(

max

max

2

1

s

crp

max

Число порций

Обработка порции

Обмен данными

r – размер порции

66

Page 67: якобовский - введение в параллельное программирование (1)

s

crp

max

r – размер порции

Как правильно?

s

c

s

c

rr

p

max

или

Зависит ли время передачи данных от размера порции (задания)?

67

Page 68: якобовский - введение в параллельное программирование (1)

Send(ai); Send(ai+1); Recv(s);

Вычисление определенного интеграла

i

a

a

B

A

i

i

dxxfdxxfI1

ii

spT max

1 2ai ai+1

68

Page 69: якобовский - введение в параллельное программирование (1)

Метод конвейерного параллелизма

?)()(1 p

knknTknknT cpc

?Время выполнения на p процессорах

69

Page 70: якобовский - введение в параллельное программирование (1)

Метод конвейерного параллелизма

c

sp

c

sp

scpc

knEpknS

pn

kp

knknTknknT

1

1)(

1

1)(

)()(1

70

Page 71: якобовский - введение в параллельное программирование (1)

При статической балансировке возможен дисбаланс загрузки процессоров

• Причины дисбаланса– Разные процессоры– Внешнее воздействие– Разная вычислительная сложность заданий

• Результат дисбаланса– Эффективная производительность определяется самым

медленным процессором

Диффузная балансировка

71

Page 72: якобовский - введение в параллельное программирование (1)

Стена Фокса

Какой объем работ забрать у среднего процессора и кому его передать?

72

Page 73: якобовский - введение в параллельное программирование (1)

Метод геометрического параллелизма

73

Page 74: якобовский - введение в параллельное программирование (1)

Метод геометрического параллелизма

74

Page 75: якобовский - введение в параллельное программирование (1)

Диффузная балансировка загрузки

75

Page 76: якобовский - введение в параллельное программирование (1)

Диффузная балансировка загрузки

76

Page 77: якобовский - введение в параллельное программирование (1)

Диффузная балансировка загрузки

77

Page 78: якобовский - введение в параллельное программирование (1)

Статическое распределение

78

Page 79: якобовский - введение в параллельное программирование (1)

Постановка задачи диффузной балансировки

Дано:• Количество точек – N• Количество процессоров – p• Процессор i обработал ni точек за время ti

Требуется:• Найти числа точек n’i , которое следует

обработать процессорам на следующем шаге • Определить сколько точек каждый из

процессоров должен передать соседним процессорам

79

Page 80: якобовский - введение в параллельное программирование (1)

Планирование нагрузки

1

0

'p

jt

n

tn

i

j

j

i

i

Nn

80

Page 81: якобовский - введение в параллельное программирование (1)

• Статическая и динамическая балансировка загрузки процессоров– Статическая балансировка

• метод сдваивания• геометрический параллелизм• конвейерный параллелизм

– Динамическая балансировка• коллективное решение• диффузная балансировка

Балансировка и алгоритмы

81

Page 82: якобовский - введение в параллельное программирование (1)

Крылья, ноги и хвосты. Гостелерадио, «Экран», 1985.

82

Page 83: якобовский - введение в параллельное программирование (1)

Общая схема вычисленийK = 1 000 000;

шаг_вывода = 10 000;

for(шаг=0;шаг<k;шаг++)

{

for(кирпич=rank*n/p;кирпич<(rank+1)*n/p;кирпич++)

Уложить (кирпич)

Обменяться данными о точках, прилегающих к внутренним границам()

if( шаг % шаг_вывода == 0 )

{

Вывести промежуточные результаты()

}

}83

Page 84: якобовский - введение в параллельное программирование (1)

r=0;for(i=0;i<=n;i++){d=a[i]+b[i]+r;c[i]=d%10;r=d/10;}

c[i]=r;

Определение суммы двух многоразрядных чисел

T1= 4nс

21015596141

3221643577

6934317835

84

Page 85: якобовский - введение в параллельное программирование (1)

Последовательное распространение разряда переноса на четырёх процессорах

99 99 99 991

100100

100100100 00 00 00

«Параллельный» алгоритм

100000000

1

99999999

85

Page 86: якобовский - введение в параллельное программирование (1)

?

Параллельный алгоритм« »

86

Page 87: якобовский - введение в параллельное программирование (1)

• Спекулятивное вычисление двух сумм

Спекулятивный алгоритм

99 99 99 991

99 99 99 100 +0100 100 100 +1

100 00 00 00

100000000

1

99999999

87

Page 88: якобовский - введение в параллельное программирование (1)

r1=0;r2=1;for(i=0;i<=n1;i++)

{d1=a[i]+b[i]+r1;c1[i]=d1%10;r1=d1/10;

d2=a[i]+b[i]+r2; c2[i]=d2%10; r2=d2/10; }Recv(&r)if(r)c=c1;else c=c2;

Спекулятивный алгоритм

T’= 8n1с

88

Page 89: якобовский - введение в параллельное программирование (1)

• Спекулятивное вычисление двух сумм

Спекулятивный алгоритм

%502

8

41

p

p

cp

c

E

pS

pn

T

nT

99 99 99 991

99 99 99 100 +0100 100 100 +1

100 00 00 00

89

Page 90: якобовский - введение в параллельное программирование (1)

A. Объём оперативной памяти одного процессорного узла достаточен для одновременного размещения в ней всех элементов массива

B. Объём оперативной памяти одного процессорного узла мал для одновременного размещения в ней всех элементов массива

Две задачи сортировки массива чисел

90

Page 91: якобовский - введение в параллельное программирование (1)

• Расположить N элементов массива a таким образом, чтобы для любого

выполнялось неравенство

Задача А

1 ii aa

2,,0 Ni

91

Page 92: якобовский - введение в параллельное программирование (1)

Пузырьковая сортировка

2

1

3

4

5

6

92

22

221

nOnnn

nKbubble

Page 93: якобовский - введение в параллельное программирование (1)

Сортировка сдваиванием

93

1523 6263 1363 9217 1268 1490 2642 5132 1235 2366 1336 1279 1268 0149 2246 1235 12233566 11233679 01124689 12223456

1112223333566679 011122224456689

011111122222223333445566666789

Page 94: якобовский - введение в параллельное программирование (1)

np

pnE

np

pn

pn

n

nS

np

nn

pn

Kppp

pn

pn

K

ppn

pn

KnK

pn

pn

npnp

bubblebubble

bubblep

22/22

2

2

2

2/

2

2

41

1)(

41

1

22

2)(

22

121

41

24

...42

4832

Сортировка сдваиванием

94

Page 95: якобовский - введение в параллельное программирование (1)

95

1523 6263 1363 9217 1268 1490 2642 5132 1235 2366 1336 1279 1268 0149 2246 1235 12233566 11233679 01124689 12223456

1112223333566679 011122224456689

011111122222223333445566666789

np

pnE

np

pnS pp 222

41

1)(

41

1)(

%100)()( 2

pnEpnS

npпри

pp

Page 96: якобовский - введение в параллельное программирование (1)

Вывод

• Эффективность больше 100%, поскольку использован неудачный медленный последовательный алгоритм.

96

Page 97: якобовский - введение в параллельное программирование (1)

• Пусть массив можно разместить на p процессорах. • Пусть на процессоре с номером rank размещено

элементов массива .

• Расположить N элементов массивов таким образом, чтобы:– для любых и

выполнялось неравенство

– для любого – выполнялось неравенство

Задача B

prank

rank

ranknN0

1,,0 prank 2,,0 rankni

rankarankn

ranka

ranki

ranki aa 1

2,,0 prank 1

01

rankrank

naa rank

97

Page 98: якобовский - введение в параллельное программирование (1)

• Части массива хранятся на нескольких процессорах– Каждая часть массива должна быть упорядочена– На процессорах с большими номерами должны быть

размещены элементы массива с большими значениями

• Правильно

• Ошибка

• Ошибка

Задача B

9,8,87,7,6,55,3,2,1

9,8,87,6,7,55,3,2,1

9,8,78,7,6,55,3,2,1

3

11

p

N

98

Page 99: якобовский - введение в параллельное программирование (1)

• Будем рассматривать только процесс упорядочивания элементов:– Перед началом сортировки на каждом из

процессоров уже есть часть элементов массива– После окончания сортировки на каждом из

процессоров должно остаться столько элементов, сколько их было в начале (но, это уже могут быть другие элементы, расположенные ранее на других процессорах)

Задача B

99

Page 100: якобовский - введение в параллельное программирование (1)

Что необходимо превзойти

Хороший последовательный алгоритм сортирует за время или

Сортировка будет выполнена всего за 20 просмотров массива.

Начальное распределение массива может занимать сравнимое время.

100

nnO log nO

nnT

n

2010log

109

2

9

Page 101: якобовский - введение в параллельное программирование (1)

– Упорядочивание фрагментов массива на каждом из процессоров ?

– Перераспределение элементов массива между процессорами

Этапы сортировки

101

Page 102: якобовский - введение в параллельное программирование (1)

?Конструирование наилучшего последовательного алгоритма

102

Page 103: якобовский - введение в параллельное программирование (1)

Алгоритм сортировки

Среднее число операций Максимальное число операций

Быстрая (qsort) 11.7 n log2n O(n 2)

Пирамидальная (hsort)

16 n log2n 18 n log2 n+ 38n

Слияние списков (lsort)

10 n log2n O(n log2n)

Сравнение алгоритмов сортировки

2CnnM

103

Page 104: якобовский - введение в параллельное программирование (1)

Пусть f(N)<C∙g(N), ну и что?

• Где тут наши 2 Гигобайта оперативной памяти???

N0 N

f(N)f(N)

g(N)

g(N)

104

Page 105: якобовский - введение в параллельное программирование (1)

100 1 000 10 000 100 000 1 000 000 1E7 1E810

20

30

40

50

60

70

80

90

100

110

120

130

140

K(n

)=10

9 T(n

) / (

n lo

g 2(n))

n - Размер массива

Исходный массив не упорядочен

D sort - слияние

Q

sort - библиотечная процедура qsort

L sort - слияние списков

H sort - пирамидальная сортировка

W sort - быстрая сортировка

Массив упорядочен Wsort - быстрая сортировка

Константа времени сортировки T=10-9K N log2(N)

105

Page 106: якобовский - введение в параллельное программирование (1)

100 1 000 10 000 100 000 1 000 000 1E7 1E80

5

10

15

20

25

30

35

40

45

50

55

60

65R

(n),

K(n

)

n - Размер массива

исходный массив не упорядочен

K(n)= 109T(n)/(n

log

2(n))

R(n)= M(n)/(n

log

2(n))

исходный массив упорядочен по убыванию

R(n)= M(n)/(n

log

2(n))

T=10-9K n log2(n)

M=10-9R n log2(n)

Пирамидальная сортировка: константы времени и числа

операций

Время работы алгоритма определяется:

• Числом операций сравнения и перестановки элементов массива

• Временем обращения к оперативной памяти

(чтения и записи элементов массива)

106

Page 107: якобовский - введение в параллельное программирование (1)

100 1 000 10 000 100 000 1 000 000 1E7 1E816

18

20

22

24

26

28

30

32

34

36

K(n

)=10

9 T(n

) / (

n lo

g 2(n))

n - Размер массива

Dsort

- слияние

Hsort

- пирамидальная

сортировка

DHsort

- оптимизированная

сортировка (слияние+пирамидальная)

Константа времени сортировки наилучшего алгоритма

107

Page 108: якобовский - введение в параллельное программирование (1)

сортировать ( массив mas, число элементов n ) { если (n > 1) { // сортировка первой половины массива сортировать ( mas, n/2); // сортировка второй половины массива сортировать ( mas+n/2, n-n/2); // слияние отсортированных половинок массива

слияние ( mas, n/2, mas+n/2,n-n/2); } }

ИзящныйИзящный алгоритм сортировки массива слиянием

108

Page 109: якобовский - введение в параллельное программирование (1)

Dsort(intsort *array, int n){ a=array;// сортируемый массив b=array_second; // вспомогательный массив

for(i=1;i<n;i=i*2) // размер объединяемых фрагментов{for(j=0;j<n;j=j+2*i) // начало первого из объединяемых

// фрагментов{r=j+i; // начало второго из объединяемых фрагментовn1=max(min(i,n-j), 0);n2=max(min(i,n-r), 0);

// слияние упорядоченных фрагментовb = a[r…r+n1] & a[j…j+n2]

}c=a;a=b;b=c;}

Алгоритм сортировки массива слиянием

109

Page 110: якобовский - введение в параллельное программирование (1)

Слияние упорядоченных фрагментов

for(ia=0,ib=0,k=0;k<n1+n2;k++)

{

if(ia>=n1) b[j+k]=a[r+ib++];

else

if(ib>=n2) b[j+k]=a[j+ia++];

else

if(a[j+ia]<a[r+ib]) b[j+k]=a[j+ia++];

else b[j+k]=a[r+ib++];

}

110

Page 111: якобовский - введение в параллельное программирование (1)

• Требуется 2 + 4 + 8 + 16 тактов (8 процессоров)

Сортировка слиянием методом сдваивания

Для просмотра анимации возможно требуется установить свободно распространяемый Swiff Point Player: http://www.globfx.com/products/swfpoint/

111

Page 112: якобовский - введение в параллельное программирование (1)

• Требуется 8 тактов вместо 16-ти

Слияние двух массивов двумя процессорами

Page 113: якобовский - введение в параллельное программирование (1)

Ускорение при методе сдваивания

)1(12log

log,1,

,

221

21

pkppn

kpn

nnkpnT

nTpnS

113

32

3156301

1

3232,10

5.3

301

13.1

44,10

1

2

1

2

9

1

2

9

kk

kk

S

kk

S

• k1 – сортировка, k2 – передача данных

113

Page 114: якобовский - введение в параллельное программирование (1)
Page 115: якобовский - введение в параллельное программирование (1)

До 10^5 пирамидальная, после - слияние

Page 116: якобовский - введение в параллельное программирование (1)

До 10^5 пирамидальнаяпосле – слияние упорядоченных фрагментов

Page 117: якобовский - введение в параллельное программирование (1)
Page 118: якобовский - введение в параллельное программирование (1)

A. Объём оперативной памяти одного процессорного узла достаточен для одновременного размещения в ней всех элементов массива

B. Объём оперативной памяти одного процессорного узла мал для одновременного размещения в ней всех элементов массива

Две задачи сортировки массива чисел

119

Page 119: якобовский - введение в параллельное программирование (1)

• Части массива хранятся на нескольких процессорах– Каждая часть массива должна быть упорядочена– На процессорах с большими номерами должны быть

размещены элементы массива с большими значениями

• Правильно

• Ошибка

• Ошибка

Задача B

9,8,87,7,6,55,3,2,1

9,8,87,6,7,55,3,2,1

9,8,78,7,6,55,3,2,1

3

11

p

N

120

Page 120: якобовский - введение в параллельное программирование (1)

• Будем рассматривать только процесс упорядочивания элементов:– Перед началом сортировки на каждом из

процессоров уже есть часть элементов массива– После окончания сортировки на каждом из

процессоров должно остаться столько элементов, сколько их было в начале (но, это уже могут быть другие элементы, расположенные ранее на других процессорах)

Задача B

121

Page 121: якобовский - введение в параллельное программирование (1)

– Упорядочивание фрагментов массива на каждом из процессоров

– Перераспределение элементов массива между процессорами с сохранением упорядоченности массива на каждом отдельном процессоре

Этапы сортировки

122

Page 122: якобовский - введение в параллельное программирование (1)

?Стратегия перераспределения данных между процессорами

123

Page 123: якобовский - введение в параллельное программирование (1)

Сеть сортировки (пузырёк) n=6 s=2n-3=9

2

1

3

4

5

6

124

Page 124: якобовский - введение в параллельное программирование (1)

Пузырьковая сортировка

2

1

3

4

5

6

125

22

221

nOnnn

nKbubble

Page 125: якобовский - введение в параллельное программирование (1)

Сеть сортировки (пузырёк) n=6 s=2n-3=9

2

1

3

4

5

6

126

Page 126: якобовский - введение в параллельное программирование (1)

Сеть сортировки четно-нечетные перестановки n=6 s=n=6

2

1

3

4

5

6

127

n

pn

pn

O 2log

Page 127: якобовский - введение в параллельное программирование (1)

Минимальная сеть сортировки n=6 s=5

2

1

3

4

Шаги: 1 2 3 4 5

5

6

128

Page 128: якобовский - введение в параллельное программирование (1)

Минимальные сети сортировки[Дональд Э.Кнут]

n=6 s=5 n=10 s=7 n=9 s=8

n=12 s=8n=16 s=9

129

Page 129: якобовский - введение в параллельное программирование (1)

Обменная сортировка со слиянием8ми элементов

130

2log

log2

22

ppn

pn

O

Page 130: якобовский - введение в параллельное программирование (1)

Сортировка блоковОДИНАКОВОГО РАЗМЕРА

2

1

3

4

Шаги: 1 2 3 4 5 6

5

6

131

Page 131: якобовский - введение в параллельное программирование (1)

Алгоритм сортировки Среднее число операций

Пирамидальная O(n log2n)

Слияние O(n log2n)

Параллельная сортировка методом сдваивания.Объём данных ограничен оперативной памятью вычислительного узла

Параллельная четно-нечетная сортировка

Объём данных ограничен общей оперативной памятью

Параллельная «обменная сортировка со слиянием»

Сравнение алгоритмов сортировки

2log

log2

22

ppn

pn

pn

O

n

pn

pn

O 2log

n

pn

pn

O 2log

nknkpn

pn

kT scc

2log2

nkkpn

pn

kT scc

2log

132

Page 132: якобовский - введение в параллельное программирование (1)

for(ia=0,ib=0,k=0;k<n;k++) {

if(ia>=n1) c[k]=b[ib++];

else

if(ib>=n2) c[k]=a[ia++];

else

if(a[ia]<b[ib]) c[k]=a[ia++];

else c[k]=b[ib++];

}

// n – число элементов в каждом из массивов a,b

Слияние упорядоченных фрагментовrank1, a[n]

rank2, b[n]

133

Page 133: якобовский - введение в параллельное программирование (1)

Join(int *a, int *b, int *c, int n,rank1,rank2)

{

if(rank==rank1)

for(ia=0,ib=0,k=0;k<n;)

{

if(a[ia]<b[ib]) c[k++]=a[ia++];

else c[k++]=b[ib++];

}

else

for(ia=n-1,ib=n-1,k=n-1;k>=0;)

{

if(a[ia]>b[ib]) c[k--]=a[ia--];

else c[k--]=b[ib--];

}

}

Слияние упорядоченных фрагментовrank1

rank2

134

Page 134: якобовский - введение в параллельное программирование (1)

// взаимодействие процессоров rank и rankC

int *a,*b,*c,*tmp;

ASend(a,n,rankC);

ARecv(b,n,rankC);

ASync();

Join(a,b,c,n,min(rank,rankC),max(rank,rankC));

tmp=a;

a=c;

c=tmp;

Реализация компаратора слияния

135

Page 135: якобовский - введение в параллельное программирование (1)

P T,сек E S Emax Smax sp

1 83.51 100.00% 1.00 100% 1.0 0

2 46.40 90.00% 1.80 100% 2.0 1

3 35.93 77.48% 2.32 95% 2.8 3

4 29.68 70.35% 2.81 96% 3.9 3

5 24.45 68.33% 3.42 91% 4.5 5

6 22.16 62.80% 3.77 92% 5.5 5

7 21.82 54.67% 3.83 89% 6.2 6

8 19.95 52.32% 4.19 90% 7.2 6

16 12.36 42.22% 6.75 82% 13.1 10

27 9.32 33.20% 8.97 74% 20.0 14

32 7.85 33.24% 10.64 73% 23.3 15

48 6.45 26.97% 12.95 66% 31.9 19

64 4.92 26.53% 16.98 64% 40.9 21

128 3.19 20.47% 26.20 56% 71.5 28

192 2.52 17.29% 33.19 51% 98.2 33

256 1.99 16.41% 42.02 49% 124.6 36

384 1.63 13.33% 51.20 49% 187.0 41

512 1.29 12.64% 64.74 42% 217.4 45

640 1.21 10.78% 69.02 41% 264.7 47

n=108 2/)1(loglog1

1

loglog

log,

222

2max

pppsn

npnE

np

2 2log log 1

2p

p ps

136

Page 136: якобовский - введение в параллельное программирование (1)

• Рассмотрены основные методы построения параллельных алгоритмов

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

• Рассмотрен ряд параллельных алгоритмов сортировки массивов и выполнено сравнение с «наилучшим» последовательным алгоритмом

Заключение

137

Page 137: якобовский - введение в параллельное программирование (1)

1. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002.

2. Грегори Р. Эндрюс - Основы многопоточного, параллельного и распределенного программирования. "Вильямс ", 2003

3. Языки программирования. Редактор Ф.Женюи. Перевод с англ. В.П.Кузнецова. Под ред. В.М.Курочкина. М:."Мир", 1972 Э. Дейкстра. Взаимодействие последовательных процессов. http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/ewd123/index.html

4. Дональд Э.Кнут. Искусство программирования, т.3. Сортировка и поиск 2-е изд.: Пер. с английского – М.: Издательский дом «Вильямс», 2001.

5. Седжвик Роберт. Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск: Пер. с англ./Роберт Седжвик. - СПб.: ООО "ДиаСофтЮП", 2002.-688с.

6. Якобовский М.В. Параллельные алгоритмы сортировки больших объемов данных. Москва, 2008. http://lira.imamod.ru/FondProgramm/Sort/ParallelSort.pdf

Список литературы

138

Page 138: якобовский - введение в параллельное программирование (1)

Литература…

Учебные курсы Интернет Университета Информационных технологий• Гергель В.П. Теория и практика параллельных вычислений. —

http://www.intuit.ru/department/calculate/paralltp/

Лекции в форме видео-конференций• Гергель В.П. Основы параллельных вычислений. —

http://www.hpcu.ru/courses/15/• Немнюгин С.А. Основы параллельного программирования с

использованием MPI . — http://www.hpcu.ru/courses/14/• Крюков В.А., Бахтин В.А. Параллельное программирование с OpenMP .

— http://www.hpcu.ru/courses/16/

Дополнительные учебные курсы:• Воеводин В.В. Вычислительная математика и структура алгоритмов. —

http://www.intuit.ru/department/calculate/calcalgo/

139

Page 139: якобовский - введение в параллельное программирование (1)

Литература

Ресурсы Internet

• http://parallel.ru• http://top500.org• http://supercomputers.ru

140

Page 140: якобовский - введение в параллельное программирование (1)

Якобовский М.В., д.ф.-м.н., зав. сектором «Программного обеспечения многопроцессорных систем и вычислительных сетей» Института математического моделирования Российской академии наукe-mail: [email protected] web: http://lira.imamod.ru

Авторы

141