Your SlideShare is downloading. ×
0
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

1,555

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,555
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Человек ненасытен. Какой бы высокой производительностью ни обладала система с одним процессором, две такие системы в сумме могут выполнять в единицу времени больший объём вычислений.
  • В рамках предлагаемого курса будут рассмотрены возможности создания параллельных алгоритмов только для систем первых двух видов. Будут рассмотрены возможности построения алгоритмов описываемых в терминах множества взаимодействующих последовательных процессов, если речь идет о системах с распределенной памятью, или потоков, если о системах с общей памятью. Такая постановка сильно сужает круг рассматриваемых алгоритмов, но не настолько, что бы их изучение потеряло смысл. Остается более чем достаточно возможностей построения быстрых алгоритмов и проблем, осложняющих жизнь. Можно условно обозначить некоторые возможности, потенциально предоставляемые многопроцессорными системами для решения некоторой Задачи: Сокращение времени решения Задачи; - Возможность решения задачи с большей точностью; - Возможность решения Задачи в уточнённой, более подробной постановке
  • Transcript

    • 1. Курс : Введение в параллельные алгоритмы Якобовский Михаил Владимирович д.ф.-м.н., зав. сектором , Институт математического моделирования РАН , Москва
    • 2. Содержание <ul><li>Введение </li></ul><ul><li>Постановка проблемы </li></ul><ul><li>Основные понятия </li></ul><ul><li>Базовые методы </li></ul><ul><li>Сумма ряда </li></ul><ul><li>Параллельная сортировка </li></ul><ul><li>Выводы </li></ul><ul><li>Контрольные вопросы </li></ul><ul><li>Литература </li></ul> из N
    • 3. Постановка проблемы <ul><li>Вычислительная мощность суперкомпьютеров быстро растет </li></ul><ul><li>Примеров успешного полноценного использования суперкомпьютеров мало </li></ul><ul><li>В среднем вычислительная мощность суперкомпьютеров используется не более, чем на несколько процентов </li></ul><ul><ul><ul><li>Необходима разработка алгоритмической и программной базы, создание которой возможно исключительно на основе тесного взаимодействия специалистов прикладных областей и специалистов в области создания параллельных приложений </li></ul></ul></ul> из N
    • 4. Введение <ul><li>Курс знакомит с некоторыми принципами разработки параллельных алгоритмов. Из всего многообразия причин, побуждающих к использованию суперкомпьютеров, в рамках курса рассматриваются только две: </li></ul><ul><ul><li>сокращение времени решения прикладных задач </li></ul></ul><ul><ul><li>обеспечение возможности решения больших задач за заданное время </li></ul></ul>
    • 5. Кризис эффективности <ul><li>Вычислительная мощность суперкомпьютеров велика, но: </li></ul><ul><ul><li>Она образована суммой мощностей множества исполнительных устройств </li></ul></ul><ul><li>На протяжении ряда лет увеличение производительность компьютера автоматически означало снижение времени работы существующих программ. Теперь это не так: </li></ul><ul><ul><li>Последовательные программы не могут работать на многопроцессорных системах быстрее , чем на последовательных </li></ul></ul>
    • 6. Кризис эффективности <ul><li>Время вычислительных систем, обладающих существенной производительностью и имеющих в своем составе только один процессор прошло </li></ul><ul><li>Автоматическое преобразование последовательных программ в параллельные невозможно </li></ul><ul><li>Необходимо знать существующие и развивать новые методы решения задач на многопроцессорных системах </li></ul>
    • 7. Уточнение круга рассматриваемых систем <ul><li>Системы на основе объединенных сетью типовых вычислительных узлов – системы с распределенной оперативной памятью </li></ul><ul><li>Системы с доступом всех процессоров к общей оперативной памяти </li></ul><ul><li>Графические ускорители </li></ul><ul><li>ПЛИС </li></ul><ul><li>Нейрокомпьютеры </li></ul><ul><li>Другие … </li></ul>
    • 8. Многопроцессорные системы с распределенной памятью
    • 9. Многопроцессорные системы с общей памятью
    • 10. Гибридные вычислительные системы сеть
    • 11. Уточнение круга рассматриваемых алгоритмов <ul><li>Слабо взаимодействующие последовательные процессы </li></ul>
    • 12. <ul><li>При запуске указываем число требуемых процессоров Np и название программы </li></ul><ul><li>На выделенных для расчета узлах запускается Np копий указанной программы </li></ul><ul><ul><li>Например, на двух узлах запущены три копии программы. Копия программы с номером 1 не имеет непосредственного доступа к оперативной памяти копий 0 и 2: </li></ul></ul><ul><li>Каждая копия программы получает два значения: </li></ul><ul><ul><li>Np </li></ul></ul><ul><ul><li>rank из диапазона [ 0 … Np-1] </li></ul></ul><ul><li>Любые две копии программы могут непосредственно обмениваться данными с помощью функций передачи сообщений </li></ul>Модель программы на распределенной памяти 0 1 2
    • 13. <ul><li>Работа начинается с запуска одной программы </li></ul><ul><li>При необходимости программа порождает новые процессы, эти процессы: </li></ul><ul><ul><li>Обладают собственными локальными переменными </li></ul></ul><ul><ul><li>Имеют доступ к общим глобальным переменным </li></ul></ul><ul><ul><li>int a_global; main нить1 нить2 </li></ul></ul><ul><ul><li>main() </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int b1_local; запуск нити1 </li></ul></ul><ul><ul><li>} запуск нити2 </li></ul></ul><ul><ul><li>fun() </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>int b2_local; ожидание </li></ul></ul><ul><ul><li>} окончания работы </li></ul></ul>Модель программы на общей памяти
    • 14. Свойства канала передачи данных T(n)=n * T байта + T латентности Число передаваемых байт Infiniband
    • 15. <ul><li>Синхронный метод </li></ul><ul><ul><li>Send( адрес данных , размер , номер процессора) </li></ul></ul><ul><ul><li>Recv( адрес данных , размер , номер процессора) </li></ul></ul><ul><li>Асинхронные методы </li></ul><ul><ul><li>Небуферизованный </li></ul></ul><ul><ul><li>ASend( адрес данных , размер , номер процессора) </li></ul></ul><ul><ul><li>ARecv( адрес данных , размер , номер процессора) </li></ul></ul><ul><ul><li>ASync </li></ul></ul><ul><ul><li>Буферизованный </li></ul></ul><ul><ul><li>ABSend( адрес данных , размер , номер процессора) </li></ul></ul>Методы передачи данных
    • 16. <ul><li>A=3 </li></ul><ul><li>Send(&A) </li></ul><ul><li>A=5 </li></ul>Синхронный <ul><li>B=4 </li></ul><ul><li>Recv(&B) </li></ul><ul><li>Print(B) </li></ul>Send Recv Print(B) A=5 B=4 A=3 Результат 3
    • 17. <ul><li>A=3 </li></ul><ul><li>А Send(&A) </li></ul><ul><li>A=5 </li></ul>Асинхронные <ul><li>B=4 </li></ul><ul><li>А Recv(&B) </li></ul><ul><li>Print(B) </li></ul>Send ASend Recv ARecv Print(B) A=5 B=4 A=3 Результат 3 ? 4 ? 5
    • 18. <ul><li>A=3 </li></ul><ul><li>А Send(&A) </li></ul><ul><li>Async() </li></ul><ul><li>A=5 </li></ul>Асинхронные <ul><li>B=4 </li></ul><ul><li>А Recv(&B) </li></ul><ul><li>Print(B) </li></ul>ASync Send ASend Recv ARecv Print(B) A=5 B=4 A=3 Результат 3 ? 4
    • 19. <ul><li>A=3 </li></ul><ul><li>А Send(&A) </li></ul><ul><li>Async() </li></ul><ul><li>A=5 </li></ul>Асинхронные <ul><li>B=4 </li></ul><ul><li>А Recv(&B) </li></ul><ul><li>Async() </li></ul><ul><li>Print(B) </li></ul><ul><li>Результат </li></ul><ul><li>3 </li></ul>ASync Send ASend ASync Recv ARecv Print(B) A=5 A=3 B=4
    • 20. <ul><li>A=3 </li></ul><ul><li>А BSend(&A) </li></ul><ul><li>A=5 </li></ul>Асинхронные буферизованные <ul><li>B=4 </li></ul><ul><li>А Recv(&B) </li></ul><ul><li>Async() </li></ul><ul><li>Print(B) </li></ul><ul><li>Результат </li></ul><ul><li>3 </li></ul>Send(&buf) ABSend ASync Recv ARecv Print(B) A=5 buf=A A=3 B=4
    • 21. <ul><li>Целочисленная неотрицательная переменная </li></ul><ul><li>Две атомарные операции, не считая инициализации </li></ul><ul><li>V(S) </li></ul><ul><ul><li>Увеличивает значение S на 1 </li></ul></ul><ul><li>P(S) </li></ul><ul><ul><li>Если S положительно, уменьшает S на 1 </li></ul></ul><ul><ul><li>Иначе ждет, пока S не станет больше 0 </li></ul></ul>Семафор <ul><li>Языки програмирования. Редактор Ф.Женюи. Перевод с англ В.П.Кузнецова. Под ред. В.М.Курочкина. М:.&quot;Мир&quot;, 1972 Э. Дейкстра. Взаимодействие последовательных процессов. http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/ewd123/index.html </li></ul>
    • 22. <ul><li>ускорение </li></ul><ul><li>параллельного </li></ul><ul><li>алгоритма </li></ul><ul><li>S(p)=T ( 1 ) /T(p) </li></ul>Ускорение и эффективность параллельных алгоритмов Ускорение параллельного алгоритма относительно наилучшего последовательного S * (p)=T * /T(p) E * (p)=S * (p)/p эффективность использования процессорной мощности E(p)=S(p)/p
    • 23. <ul><li>Да, если: </li></ul><ul><ul><li>Сравниваем с плохим последовательным алгоритмом </li></ul></ul><ul><ul><li>Аппаратные особенности вычислительной системы косвенно влияют на эффективную скорость обработки данных </li></ul></ul>Может ли быть S ( p ) >p ?
    • 24. <ul><li>Да </li></ul><ul><ul><li>Если первый алгоритм позволяет использовать больше процессоров, чем второй. </li></ul></ul><ul><li>Самый эффективный алгоритм – использующий один (1) процессор. </li></ul><ul><ul><li>Его эффективность по определению равна 100%, но он не всегда самый быстрый. </li></ul></ul>Может ли неэффективный алгоритм работать быстрее эффективного?
    • 25. <ul><li>Все элементарные операции (+ - * / ) выполняются за время  с </li></ul><ul><li>Все операции выполняются точно, результат не зависит от порядка их выполнения </li></ul>Определить сумму конечного ряда
    • 26. <ul><li>S=1; </li></ul><ul><li>a=1; </li></ul><ul><li>for(i=1;i<= n;i ++ ) </li></ul><ul><li>{ </li></ul><ul><li>a=a*x/i; </li></ul><ul><li>S=S+a; </li></ul><ul><li>} </li></ul>Последовательный алгоритм T 1 = 3n  с
    • 27. Параллельный алгоритм <ul><li>Вычислить для всех i =1,…,n : x i </li></ul><ul><li>Вычислить для всех i =1,…,n : i! </li></ul><ul><li>Вычислить для всех i =1,…,n : a i = </li></ul><ul><li>Вычислить сумму всех членов a i </li></ul>
    • 28. <ul><li>Для вычисления x i воспользуемся методом бинарного умножения </li></ul><ul><ul><li>x </li></ul></ul><ul><ul><li>1 x 2 </li></ul></ul><ul><ul><li>2 x 3 x 4 </li></ul></ul><ul><ul><li>3 x 5 x 6 x 7 x 8 </li></ul></ul><ul><ul><li>4 x 9 x 10 x 11 x 12 x 13 x 14 x 15 x 16 </li></ul></ul>x i
    • 29. <ul><li>Для вычисления i! воспользуемся </li></ul><ul><li>аналогичным методом </li></ul><ul><ul><li>4 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16=16! </li></ul></ul><ul><ul><li>3 1  2  3  4  5  6  7  8 9  10  11  12  13  14  15  16 </li></ul></ul><ul><ul><li>2 1  2  3  4 5  6  7  8 9  10  11  12 13  14  15  16 </li></ul></ul><ul><ul><li>1 1  2 3  4 5  6 7  8 9  10 11  12 13  14 15  16 </li></ul></ul>16 !
    • 30. <ul><li>Для вычисления i! воспользуемся </li></ul><ul><li>аналогичным методом </li></ul><ul><ul><li>4 1  2  3  4  5  6  7  8  9  10  11  12 =12! </li></ul></ul><ul><ul><li>3 1  2  3  4  5  6  7  8 9  10  11  12  13  14  15  16 </li></ul></ul><ul><ul><li>2 1  2  3  4 5  6  7  8 9  10  11  12 13  14  15  16 </li></ul></ul><ul><ul><li>1 1  2 3  4 5  6 7  8 9  10 11  12 13  14 15  16 </li></ul></ul>12 !
    • 31. <ul><li>Для вычисления i! воспользуемся </li></ul><ul><li>аналогичным методом </li></ul><ul><ul><li>4 1  2  3  4  5  6  7  8  9  10  11  12  13  14=14! </li></ul></ul><ul><ul><li>3 1  2  3  4  5  6  7  8 9  10  11  12  13  14 </li></ul></ul><ul><ul><li>2 1  2  3  4 5  6  7  8 9  10  11  12 </li></ul></ul><ul><ul><li>1 1  2 3  4 5  6 7  8 9  10 11  12 13  14 15  16 </li></ul></ul>14 !
    • 32. Параллельный алгоритм <ul><li>Вычислить все x i : </li></ul><ul><li>Вычислить все i! : </li></ul><ul><li>Вычислить все a i : - надо n процессоров </li></ul><ul><li>Вычислить сумму всех a i : </li></ul>2
    • 33. <ul><li>p=n </li></ul>Ускорение и эффективность при p=n 2 1.5 1.5
    • 34. Методы построения параллельных алгоритмов <ul><li>… если для нас представляют интерес реально работающие системы, то требуется убедиться, (и убедить всех сомневающихся) в корректности наших построений </li></ul><ul><li>… системе часто придется работать в невоспроизводимых обстоятельствах, и мы едва ли можем ожидать сколько-нибудь серьезной помощи от тестов </li></ul><ul><li>Dijkstra E.W. </li></ul><ul><li>1966 </li></ul>
    • 35. <ul><li>Методы построения параллельных алгоритмов и их свойства: </li></ul><ul><ul><li>Статическая балансировка </li></ul></ul><ul><ul><ul><li>метод сдваивания </li></ul></ul></ul><ul><ul><ul><li>геометрический параллелизм </li></ul></ul></ul><ul><ul><ul><li>конвейерный параллелизм </li></ul></ul></ul><ul><ul><li>Динамическая балансировка </li></ul></ul><ul><ul><ul><li>коллективное решение </li></ul></ul></ul><ul><ul><ul><li>диффузная балансировка загрузки </li></ul></ul></ul>Огласите весь список, пожалуйста! «Напарник», Леонид Гайдай
    • 36. <ul><li>Обладает запасом внутреннего параллелизма </li></ul><ul><ul><li>Есть возможность одновременного выполнения операций </li></ul></ul><ul><li>Допускает возможность равномерного распределения вычислительных операций между процессорами </li></ul><ul><li>Обладает низким уровнем накладных расходов </li></ul>Хороший параллельный алгоритм большим большим числом
    • 37. <ul><li>Операции, отсутствующие в наилучшем последовательном алгоритме: </li></ul><ul><ul><li>Синхронизация </li></ul></ul><ul><ul><li>Обмен данными </li></ul></ul><ul><ul><li>Дублирование операций </li></ul></ul><ul><ul><li>Новые операции </li></ul></ul>Накладные расходы
    • 38. <ul><li>Потери времени на передачу данных между процессами </li></ul><ul><ul><li>Процессор 1 Процессор 2 </li></ul></ul>Обмен данными
    • 39. <ul><li>Потери времени на ожидание долго выполняющихся процессов </li></ul><ul><ul><li>Процессор 1 Процессор 2 Процессор 3 </li></ul></ul>Синхронизация
    • 40. <ul><li>S=0; </li></ul><ul><li>For(i=0;i<n1;i++) </li></ul><ul><li>S+=a[i]; </li></ul><ul><li>Send(S) </li></ul>Дублирование операций S=0; For(i=n1;i<n;i++) S+=a[i]; Send(S) Recv(S1) Recv(S2) S=S1+S2
    • 41. Новые операции F=1; for(i=2;i <= n;i ++ ) F*=i; Вычисление всех факториалов до 8! включительно Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4 1 1  2 3  4 5  6 7  8 2 12  3 12  34 56  7 56  78 3 1234  5 1234  56 1234  567 1234  5678
    • 42. Новые операции 1 2 4 3 8 5 9 11 6 7 12 10 Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4 1 1  2 3  4 5  6 7  8 2 12  3 12  34 56  7 56  78 3 1234  5 1234  56 1234  567 1234  5678 Шаг Процессор 1 Процессор 2 Процессор 3 Процессор 4 1 2! 3  4 5  6 7  8 2 3! 4! 56  7 56  78 3 5! 6! 7! 8!
    • 43. <ul><li>Каскадная схема </li></ul><ul><li>Модифицированная каскадная схема </li></ul>Метод сдваивания
    • 44. Стена Фокса n – ширина стены к – высота стены
    • 45. Одномерная разностная схема для уравнения диффузии
    • 46. Решение одномерного уравнения на 9 моментов времени
    • 47. Метод геометрического параллелизма
    • 48. А почему? <ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><li>} </li></ul>
    • 49. ? <ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><li>} </li></ul>0 1 2 3 4 5  =<   >= =<   >= =<   >= =<   >= =<  >=
    • 50. ? <ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><li>} </li></ul>0 1 2 3 4 5  =<   >= =<   >= =<   >= =<   >= =<  >=
    • 51. ? <ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><li>} </li></ul>0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 52. ? 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 53. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 54. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 55. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 56. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 57. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 58. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 59. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 60. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 61. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 62. ! 0 1 2 3 4 5 =<   =<  >=  =<  >=  =<  >=  =<  >=  >=
    • 63. ! 0 1 2 3 4 5 =<   >= =<  =<   >=  >= =<  =<   >=  >=
    • 64. ! <ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>if(rank%2) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>else </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>if(rank<p-1) Recv(rank +1 , место готово? ) </li></ul></ul><ul><ul><li>if(rank<p-1) Send(rank+1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Send(rank-1, кирпич уложен! ) </li></ul></ul><ul><ul><li>if(rank>0) Recv(rank-1, место готово? ) </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
    • 65. Метод коллективного решения (укладка паркета)
    • 66. Метод коллективного решения (укладка паркета) Число порций Обработка порции Обмен данными r – размер порции
    • 67. r – размер порции Как правильно? или Зависит ли время передачи данных от размера порции (задания)?
    • 68. <ul><li>Send( a i ); Send( a i+1 ); Recv( s ); </li></ul>Вычисление определенного интеграла a i a i +1
    • 69. Метод конвейерного параллелизма ? Время выполнения на p процессорах
    • 70. Метод конвейерного параллелизма
    • 71. <ul><li>При статической балансировке возможен дисбаланс загрузки процессоров </li></ul><ul><li>Причины дисбаланса </li></ul><ul><ul><li>Разные процессоры </li></ul></ul><ul><ul><li>Внешнее воздействие </li></ul></ul><ul><ul><li>Разная вычислительная сложность заданий </li></ul></ul><ul><li>Результат дисбаланса </li></ul><ul><ul><li>Эффективная производительность определяется самым медленным процессором </li></ul></ul>Диффузная балансировка
    • 72. Стена Фокса Какой объем работ забрать у среднего процессора и кому его передать?
    • 73. Метод геометрического параллелизма
    • 74. Метод геометрического параллелизма
    • 75. Диффузная балансировка загрузки
    • 76. Диффузная балансировка загрузки
    • 77. Диффузная балансировка загрузки
    • 78. Статическое распределение
    • 79. Постановка задачи диффузной балансировки <ul><li>Дано: </li></ul><ul><li>Количество точек – N </li></ul><ul><li>Количество процессоров – p </li></ul><ul><li>Процессор i обработал n i точек за время t i </li></ul><ul><li>Требуется: </li></ul><ul><li>Найти числа точек n’ i , которое следует обработать процессорам на следующем шаге </li></ul><ul><li>Определить сколько точек каждый из процессоров должен передать соседним процессорам </li></ul>
    • 80. Планирование нагрузки
    • 81. <ul><li>Статическая и динамическая балансировка загрузки процессоров </li></ul><ul><ul><li>Статическая балансировка </li></ul></ul><ul><ul><ul><li>метод сдваивания </li></ul></ul></ul><ul><ul><ul><li>геометрический параллелизм </li></ul></ul></ul><ul><ul><ul><li>конвейерный параллелизм </li></ul></ul></ul><ul><ul><li>Динамическая балансировка </li></ul></ul><ul><ul><ul><li>коллективное решение </li></ul></ul></ul><ul><ul><ul><li>диффузная балансировка </li></ul></ul></ul>Балансировка и алгоритмы
    • 82. Крылья, ноги и хвосты. Гостелерадио, «Экран», 1985.
    • 83. Общая схема вычислений <ul><li>K = 1 000 000; </li></ul><ul><li>шаг_вывода = 1 0 0 0 0; </li></ul><ul><li>for( шаг =0; шаг <k; шаг ++) </li></ul><ul><li>{ </li></ul><ul><ul><li>for( кирпич =rank*n/p; кирпич <(rank+1)*n/p; кирпич ++) </li></ul></ul><ul><ul><li>Уложить ( кирпич ) </li></ul></ul><ul><ul><li>Обменяться данными о точках, прилегающих к внутренним границам() </li></ul></ul><ul><ul><li>if( шаг % шаг_вывода == 0 ) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>Вывести промежуточные результаты() </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
    • 84. <ul><li>r=0; </li></ul><ul><li>for(i=0;i<=n;i ++ ) </li></ul><ul><li>{ </li></ul><ul><li>d=a[i] + b[i] + r; </li></ul><ul><li>c[i]=d % 10; </li></ul><ul><li>r=d / 10; </li></ul><ul><li>} </li></ul><ul><li>c[i]=r; </li></ul>Определение суммы двух многоразрядных чисел T 1 = 4n  с
    • 85. «Параллельный» алгоритм Последовательное распространение разряда переноса на четырёх процессорах 99 99 99 99 1 1 00 1 00 1 00 100 100 00 00 00
    • 86. ? Параллельный алгоритм « »
    • 87. <ul><li>Спекулятивное вычисление двух сумм </li></ul>Спекулятивный алгоритм 99 99 99 99 1 99 99 99 100 +0 100 1 00 1 00 +1 100 00 00 00
    • 88. <ul><li>r1=0; </li></ul><ul><li>r2=1; </li></ul><ul><li>for(i=0;i<=n1;i ++ ) </li></ul><ul><li>{ </li></ul><ul><li>d1=a[i] + b[i] + r1; </li></ul><ul><li>c1[i]=d1 % 10; </li></ul><ul><li>r1=d1 / 10; </li></ul><ul><li>d2=a[i] + b[i] + r2; </li></ul><ul><li>c2[i]=d2 % 10; </li></ul><ul><li>r2=d2 / 10; </li></ul><ul><li>} </li></ul><ul><li>Recv(&r) </li></ul><ul><li>if(r)c=c1; </li></ul><ul><li>else c=c2; </li></ul>Спекулятивный алгоритм T’= 8n 1  с
    • 89. <ul><li>Спекулятивное вычисление двух сумм </li></ul>Спекулятивный алгоритм 99 99 99 99 1 99 99 99 100 +0 100 1 00 1 00 +1 100 00 00 00
    • 90. <ul><ul><li>Объём оперативной памяти одного процессорного узла достаточен для одновременного размещения в ней всех элементов массива </li></ul></ul><ul><ul><li>Объём оперативной памяти одного процессорного узла мал для одновременного размещения в ней всех элементов массива </li></ul></ul>Две задачи сортировки массива чисел
    • 91. <ul><li>Расположить N элементов массива a таким образом, чтобы для любого выполнялось неравенство </li></ul>Задача А
    • 92. Пузырьковая сортировка
    • 93. Сортировка сдваиванием
    • 94. Сортировка сдваиванием
    • 95.
    • 96. Вывод <ul><li>Эффективность больше 100%, поскольку использован неудачный медленный последовательный алгоритм. </li></ul>
    • 97. <ul><li>Пусть массив можно разместить на p процессорах. </li></ul><ul><li>Пусть на процессоре с номером rank размещено элементов массива . </li></ul><ul><li>Расположить N элементов массивов таким образом, чтобы: </li></ul><ul><ul><li>для любых и выполнялось неравенство </li></ul></ul><ul><ul><li>для любого </li></ul></ul><ul><ul><li>выполнялось неравенство </li></ul></ul>Задача B
    • 98. <ul><li>Части массива хранятся на нескольких процессорах </li></ul><ul><ul><li>Каждая часть массива должна быть упорядочена </li></ul></ul><ul><ul><li>На процессорах с б о льшими номерами должны быть размещены элементы массива с б о льшими значениями </li></ul></ul><ul><ul><ul><li>Правильно </li></ul></ul></ul><ul><ul><ul><li>Ошибка </li></ul></ul></ul><ul><ul><ul><li>Ошибка </li></ul></ul></ul>Задача B
    • 99. <ul><li>Будем рассматривать только процесс упорядочивания элементов: </li></ul><ul><ul><li>Перед началом сортировки на каждом из процессоров уже есть часть элементов массива </li></ul></ul><ul><ul><li>После окончания сортировки на каждом из процессоров должно остаться столько элементов, сколько их было в начале (но, это уже могут быть другие элементы, расположенные ранее на других процессорах) </li></ul></ul>Задача B
    • 100. Что необходимо превзойти <ul><li>Хороший последовательный алгоритм сортирует за время или </li></ul><ul><li>Сортировка будет выполнена всего за 20 просмотров массива. </li></ul><ul><li>Начальное распределение массива может занимать сравнимое время. </li></ul>
    • 101. <ul><ul><li>Упорядочивание фрагментов массива на каждом из процессоров ? </li></ul></ul><ul><ul><li>Перераспределение элементов массива между процессорами </li></ul></ul>Этапы сортировки
    • 102. <ul><li>? </li></ul>Конструирование наилучшего последовательного алгоритма
    • 103. Сравнение алгоритмов сортировки Алгоритм сортировки Среднее число операций М аксимальное число операций Быстрая ( qsort ) 11.7 n log 2 n O(n 2 ) Пирамидальная ( hsort ) 16 n log 2 n 18 n log 2 n + 38 n Слияние списков ( lsort ) 10 n log 2 n O(n log 2 n)
    • 104. Пусть f(N) <C∙ g(N) , ну и что ? <ul><li>Где тут наши 2 Гигобайта оперативной памяти??? </li></ul>f(N) f(N) g(N) g(N)
    • 105. Константа времени сортировки T= 10 -9 K N log 2 (N)
    • 106. Пирамидальная сортировка: константы времени и числа операций T= 10 -9 K n log 2 (n) M= 10 -9 R n log 2 (n) <ul><li>Время работы алгоритма определяется: </li></ul><ul><li>Числом операций сравнения и перестановки элементов массива </li></ul><ul><li>Временем обращения к оперативной памяти (чтения и записи элементов массива) </li></ul>
    • 107. Константа времени сортировки наилучшего алгоритма
    • 108. <ul><li>сортировать ( массив mas, число элементов n ) </li></ul><ul><li>{ </li></ul><ul><li>если (n > 1) </li></ul><ul><li>{ </li></ul><ul><li>// сортировка первой половины массива </li></ul><ul><li>сортировать ( mas, n/2); </li></ul><ul><li>// сортировка второй половины массива </li></ul><ul><li>сортировать ( mas+n/2, n-n/2); </li></ul><ul><li>// слияние отсортированных половинок массива </li></ul><ul><li>слияние ( mas , n /2, mas + n /2, n - n /2); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>Изящный алгоритм сортировки массива слиянием
    • 109. <ul><li>Dsort (intsort *array, int n) </li></ul><ul><li>{ </li></ul><ul><li>a=array; // сортируемый массив </li></ul><ul><li>b=array_second; // вспомогательный массив </li></ul><ul><li>for(i=1;i<n;i= i *2) // размер объединяемых фрагментов </li></ul><ul><li>{ </li></ul><ul><li>for(j=0;j<n;j= j +2*i) // начало первого из объединяемых </li></ul><ul><li> // фрагментов </li></ul><ul><li>{ </li></ul><ul><li>r=j+i; // начало второго из объединяемых фрагментов </li></ul><ul><li>n1=max(min(i,n-j), 0); </li></ul><ul><li>n2=max(min(i,n-r), 0); </li></ul><ul><li>// слияние упорядоченных фрагментов </li></ul><ul><ul><ul><ul><ul><li>b = a[r…r+n1] & a[j…j+n2] </li></ul></ul></ul></ul></ul><ul><li>} </li></ul><ul><li>c=a;a=b;b=c; </li></ul><ul><li>} </li></ul>Алгоритм сортировки массива слиянием
    • 110. Слияние упорядоченных фрагментов <ul><li>for(ia=0,ib=0,k=0;k<n1+n2;k++) </li></ul><ul><li>{ </li></ul><ul><li>if(ia>=n1) b[j+k]=a[r+ib++]; </li></ul><ul><li>else </li></ul><ul><li>if(ib>=n2) b[j+k]=a[j+ia++]; </li></ul><ul><li>else </li></ul><ul><li>if(a[j+ia]<a[r+ib]) b[j+k]=a[j+ia++]; </li></ul><ul><li>else b[j+k]=a[r+ib++]; </li></ul><ul><li>} </li></ul>
    • 111. <ul><li>Требуется 2 + 4 + 8 + 16 тактов (8 процессоров) </li></ul>Сортировка слиянием методом сдваивания Для просмотра анимации возможно требуется установить свободно распространяемый Swiff Point Player : http://www.globfx.com/products/swfpoint/
    • 112. <ul><li>Требуется 8 тактов вместо 16-ти </li></ul>Слияние двух массивов двумя процессорами
    • 113. Ускорение при методе сдваивания <ul><li>k 1 – сортировка, k 2 – передача данных </li></ul>
    • 114.  
    • 115. До 10 ^ 5 пирамидальная, после - слияние
    • 116. До 10 ^ 5 пирамидальная после – слияние упорядоченных фрагментов
    • 117.  
    • 118.  
    • 119. <ul><ul><li>Объём оперативной памяти одного процессорного узла достаточен для одновременного размещения в ней всех элементов массива </li></ul></ul><ul><ul><li>Объём оперативной памяти одного процессорного узла мал для одновременного размещения в ней всех элементов массива </li></ul></ul>Две задачи сортировки массива чисел
    • 120. <ul><li>Части массива хранятся на нескольких процессорах </li></ul><ul><ul><li>Каждая часть массива должна быть упорядочена </li></ul></ul><ul><ul><li>На процессорах с б о льшими номерами должны быть размещены элементы массива с б о льшими значениями </li></ul></ul><ul><ul><ul><li>Правильно </li></ul></ul></ul><ul><ul><ul><li>Ошибка </li></ul></ul></ul><ul><ul><ul><li>Ошибка </li></ul></ul></ul>Задача B
    • 121. <ul><li>Будем рассматривать только процесс упорядочивания элементов: </li></ul><ul><ul><li>Перед началом сортировки на каждом из процессоров уже есть часть элементов массива </li></ul></ul><ul><ul><li>После окончания сортировки на каждом из процессоров должно остаться столько элементов, сколько их было в начале (но, это уже могут быть другие элементы, расположенные ранее на других процессорах) </li></ul></ul>Задача B
    • 122. <ul><ul><li>Упорядочивание фрагментов массива на каждом из процессоров </li></ul></ul><ul><ul><li>Перераспределение элементов массива между процессорами с сохранением упорядоченности массива на каждом отдельном процессоре </li></ul></ul>Этапы сортировки
    • 123. <ul><li>? </li></ul>Стратегия перераспределения данных между процессорами
    • 124. Сеть сортировки (пузырёк) n= 6 s = 2n-3=9
    • 125. Пузырьковая сортировка
    • 126. Сеть сортировки (пузырёк) n= 6 s = 2n-3=9
    • 127. Сеть сортировки четно-нечетные перестановки n= 6 s = n= 6
    • 128. Минимальная сеть сортировки n= 6 s=5
    • 129. Минимальные сети сортировки <ul><li>[ Дональд Э.Кнут ] </li></ul>n=6 s=5 n=10 s=7 n=9 s=8 n=12 s=8 n=16 s=9
    • 130. Обменная сортировка со слиянием 8ми элементов
    • 131. Сортировка блоков ОДИНАКОВОГО РАЗМЕРА
    • 132. Сравнение алгоритмов сортировки Алгоритм сортировки Среднее число операций Пирамидальная O( n log 2 n) Слияние O( n log 2 n) Параллельная сортировка методом сдваивани я. Объём данных ограничен оперативной памятью вычислительного узла Параллельная четно-нечетная сортировка Объём данных ограничен общей оперативной памятью Параллельная «обменная сортировка со слиянием»
    • 133. Слияние упорядоченных фрагментов 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]
    • 134. Слияние упорядоченных фрагментов 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
    • 135. <ul><li>// взаимодействие процессоров rank и rankC </li></ul><ul><li>int *a,*b,*c,*tmp; </li></ul><ul><li>ASend(a,n,rankC); </li></ul><ul><li>ARecv(b,n,rankC); </li></ul><ul><li>ASync(); </li></ul><ul><li>Join(a,b,c,n,min(rank,rankC),max(rank,rankC)); </li></ul><ul><li>tmp=a; </li></ul><ul><li>a=c; </li></ul><ul><li>c=tmp; </li></ul>Реализация компаратора слияния
    • 136. n=10 8 P T, сек E S E max S max s p 1 83.51 100.00% 1.00 100% 1.0 0 2 46.40 90.00% 1.80 100% 2.0 1 3 35.9 3 77.48% 2.32 95% 2.8 3 4 29.6 8 70.35% 2.81 96% 3.9 3 5 24.4 5 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.3 2 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.9 2 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
    • 137. <ul><li>Рассмотрены основные методы построения параллельных алгоритмов </li></ul><ul><li>Показано, как за счет использования неэффективных, но обладающих большим внутренним параллелизмом алгоритмов можно сокращать время решения задачи на многопроцессорной системе </li></ul><ul><li>Рассмотрен ряд параллельных алгоритмов сортировки массивов и выполнено сравнение с «наилучшим» последовательным алгоритмом </li></ul>Заключение
    • 138. <ul><li>Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. </li></ul><ul><li>Грегори Р. Эндрюс - Основы многопоточного, параллельного и распределенного программирования. &quot;Вильямс &quot;, 2003 </li></ul><ul><li>Языки программирования. Редактор Ф.Женюи. Перевод с англ. В.П.Кузнецова. Под ред. В.М.Курочкина. М:.&quot;Мир&quot;, 1972 Э. Дейкстра. Взаимодействие последовательных процессов. http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/ewd123/index.html </li></ul><ul><li>Дональд Э.Кнут . Искусство программирования, т.3. Сортировка и поиск 2-е изд.: Пер. с английского – М.: Издательский дом «Вильямс», 2001. </li></ul><ul><li>Седжвик Роберт . Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск: Пер. с англ./Роберт Седжвик. - СПб.: ООО &quot;ДиаСофтЮП&quot;, 2002.-688с. </li></ul><ul><li>Якобовский М.В. Параллельные алгоритмы сортировки больших объемов данных . Москва, 2008. http://lira.imamod.ru/FondProgramm/Sort/ParallelSort.pdf </li></ul>Список литературы
    • 139. Литература… <ul><li>Учебные курсы Интернет Университета Информационных технологий </li></ul><ul><li>Гергель В.П. Теория и практика параллельных вычислений. — http://www.intuit.ru/department/calculate/paralltp/ </li></ul><ul><li>Лекции в форме видео-конференций </li></ul><ul><li>Гергель В.П. Основы параллельных вычислений. — http://www.hpcu.ru/courses/15/ </li></ul><ul><li>Немнюгин С.А. Основы параллельного программирования с использованием MPI . — http://www.hpcu.ru/courses/14/ </li></ul><ul><li>Крюков В.А., Бахтин В.А. Параллельное программирование с OpenMP . — http://www.hpcu.ru/courses/16/ </li></ul><ul><li>Дополнительные учебные курсы: </li></ul><ul><li>Воеводин В.В. Вычислительная математика и структура алгоритмов. — http://www.intuit.ru/department/calculate/calcalgo/ </li></ul>
    • 140. Литература <ul><li>Ресурсы Internet </li></ul><ul><li>http://parallel.ru </li></ul><ul><li>http://top500.org </li></ul><ul><li>http://supercomputers.ru </li></ul>
    • 141. <ul><li>Якобовский М.В. , д.ф.-м.н., зав. сектором «Программного обеспечения многопроцессорных систем и вычислительных сетей» Института математического моделирования Российской академии наук </li></ul><ul><li>e-mail: [email_address] </li></ul><ul><li>web: http://lira.imamod.ru </li></ul>Авторы

    ×