Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Основы разработки высокопроизводительных параллельных приложений. <br />Практикум.<br />Департамент стратегических техноло...
Содержание<br />
Инфраструктура<br />Туалеты<br />Перерывы<br />Эвакуация != <br />Тренеры<br />Денис Котляров, Microsoft<br />Василий Мал...
Часть 1. Введение в параллелизм. Многопоточное программирование. <br />
Введение<br /><ul><li>Зачем?
Типы параллелизма.
Ускорение->ЭффективностьvsПереносимость
Распараллеливание = Инструменты &&</li></ul>     (Предметные области || Задачи)<br />
Описание предметной области<br />
Описание предметной области<br />800<br />600<br />
Описание предметной области<br />
n = количество проц.<br />Tпаралл.= {(1-P) + P/n}Tпослед<br />Закон Амдала<br />P<br />Ускорение= Tпослед/ Tпаралл.<br />P...
Проведение вычислений на локальной машине<br />Для проведения эксперимента необходимо открыть в <br /> в VS 2008 проект из...
Проведение вычислений на локальной машине<br />
Постановка задач для кластера в HPCS<br />Адрес MSU кластера  IKI кластера	HN.PRACTICUM.CS.MSU.SU   193.232.2.150<br />Имя...
WHPCS<br />
Постановка задач для кластера в HPCS<br />
Постановка задач для кластера в HPCS<br />
Постановка задач для кластера в HPCS<br />
Постановка задач для кластера в HPCS<br />	Для последовательных и OpenMPпрограмм:<br />app.exe  argument1  argument2 ...<b...
Постановка задач для кластера в HPCS<br />6) После сохранения задачи, нажмите кнопку «Submit». Должно появится окно подтве...
Постановка задач для кластера в HPCS<br />
Постановка задач для кластера в HPCS<br />Для просмотра загруженности вычислительных узлов при выполнении задачи, необходи...
Постановка задач для кластера в HPCS<br />Консоли :<br />> job submit /scheduler:headnode /jobname:MyJob /numprocessors:1-...
Последовательно о многопоточном.<br />
Процессы и потоки<br />Stack<br />Сегмент кода<br />Сегмент данных<br />Stack<br />Stack<br />thread<br />thread<br />…<br...
Средства создания многопоточных программ<br />Ручные: Библиотеки потоков<br />Posix Threads<br />Windows Threads<br />…<br...
Синхронизация потоков<br />Необходима при:<br />Совместном использовании ресурса (атомарные операции)<br />Уведомлении пот...
n = количество проц.<br />Tпаралл.= {(1-P) + P/n}Tпослед<br />Закон Амдала<br />P<br />Ускорение= Tпослед/ Tпаралл.<br />P...
29<br />Parallel Programming Models<br />Functional Decomposition<br />Task parallelism<br />Divide the computation, then ...
Просто OpenMP<br />Главный поток<br />Параллельные регионы<br />Параллелизм Fork-join: <br /><ul><li>Главный поток (Master...
Upcoming SlideShare
Loading in …5
×

20090720 hpc exercise1

724 views

Published on

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

20090720 hpc exercise1

  1. 1. Основы разработки высокопроизводительных параллельных приложений. <br />Практикум.<br />Департамент стратегических технологий, <br />Microsoft.<br />
  2. 2. Содержание<br />
  3. 3. Инфраструктура<br />Туалеты<br />Перерывы<br />Эвакуация != <br />Тренеры<br />Денис Котляров, Microsoft<br />Василий Маланин, Microsoft<br />Андрей Паринов, Независимый эксперт<br />Группа поддержки<br />
  4. 4.
  5. 5.
  6. 6. Часть 1. Введение в параллелизм. Многопоточное программирование. <br />
  7. 7. Введение<br /><ul><li>Зачем?
  8. 8. Типы параллелизма.
  9. 9. Ускорение->ЭффективностьvsПереносимость
  10. 10. Распараллеливание = Инструменты &&</li></ul> (Предметные области || Задачи)<br />
  11. 11. Описание предметной области<br />
  12. 12. Описание предметной области<br />800<br />600<br />
  13. 13. Описание предметной области<br />
  14. 14. n = количество проц.<br />Tпаралл.= {(1-P) + P/n}Tпослед<br />Закон Амдала<br />P<br />Ускорение= Tпослед/ Tпаралл.<br />P/2<br />Послед.<br />T<br />P/∞<br />(1-P)<br />(1-P)<br />Описывает верхний предел ускорения от параллельного выполнения<br />Последовательный код ограничивает ускорение<br />
  15. 15. Проведение вычислений на локальной машине<br />Для проведения эксперимента необходимо открыть в <br /> в VS 2008 проект из папки SolutionsSequentialSeqContrastStretch<br />Необходимо выбрать архитектуру процессора, на которому будут провиодиться<br />вычисления. Для проведение вычислений на кластере необходимо выбрать <br />64-х битную архитектуру процессора.<br />
  16. 16. Проведение вычислений на локальной машине<br />
  17. 17. Постановка задач для кластера в HPCS<br />Адрес MSU кластера IKI кластера HN.PRACTICUM.CS.MSU.SU 193.232.2.150<br />Имя головного узла (head node)hn.practicumhn.cluster.local<br />Имя вычислительных узлов cn1,cn2… cn1.cluster.local,cn2.cluster.local…<br />Сетевая папка доступная всем hn.practicumapps hn.cluster.localapps<br />вычислительным узлам <br />Сетевая папка на каждом n1Apps, n2Apps... cn1.cluster.localapps<br />вычилительном узле<br />(физический расположенная в C:Apps)<br />Для доступа к IKI кластеру необходимо включить VPN соединение, указав <br />User name: <user_ name><br />Password: < password><br />Domain: Cluster<br />
  18. 18. WHPCS<br />
  19. 19. Постановка задач для кластера в HPCS<br />
  20. 20. Постановка задач для кластера в HPCS<br />
  21. 21. Постановка задач для кластера в HPCS<br />
  22. 22. Постановка задач для кластера в HPCS<br /> Для последовательных и OpenMPпрограмм:<br />app.exe argument1 argument2 ...<br />Для программы MPI:<br />mpiexec mpiapp.exe argument1 argument2 ...<br />
  23. 23. Постановка задач для кластера в HPCS<br />6) После сохранения задачи, нажмите кнопку «Submit». Должно появится окно подтверждения прав для постановки задачи. Необходимо ввести имя пользователя и пароль. Например, если имя пользователя “domainhpcuser”, то окно будет иметь вид<br />
  24. 24. Постановка задач для кластера в HPCS<br />
  25. 25. Постановка задач для кластера в HPCS<br />Для просмотра загруженности вычислительных узлов при выполнении задачи, необходимо открыть вкладку Heat Map в Windows HPC Server. Например, вид окна должен быть таким:<br />
  26. 26. Постановка задач для кластера в HPCS<br />Консоли :<br />> job submit /scheduler:headnode /jobname:MyJob /numprocessors:1-1 /exclusive:true /workdir:eadnodePublicDrJoe /stdout:_OUT.txt /stderr:_ERR.txt /user:domainhpcuser SeqContrastStretch.exe Sunset.bmp result.bmp 75 1<br />Windows PowerShell :<br />> $job = new-hpcjob –scheduler "headnode" –name "MyJob" –numprocessors "1-1" –exclusive 1<br />> add-hpctask –scheduler "headnode" –job $job –workdir "eadnodePublicDrJoe" –stdout "_OUT.txt" –stderr "_ERR.txt" –command "SeqContrastStretch.exe Sunset.bmp result.bmp 75 1"<br />> submit-hpcjob –scheduler "headnode" –job $job –credential "domainhpcuser"<br />
  27. 27. Последовательно о многопоточном.<br />
  28. 28. Процессы и потоки<br />Stack<br />Сегмент кода<br />Сегмент данных<br />Stack<br />Stack<br />thread<br />thread<br />…<br />Преимущества потоков:<br />Быстрое переключение между потоками (переключение между процессами очень ресурсоемкая операция)<br />Простая организация взаимодействия – общая память<br />Недостатки потоков:<br />Некорректное использование данных одним потоком отражается на всех других<br />Необходимость в синхронизации при доступе к общим данным<br />Используемые библиотеки должны поддерживать многопоточность<br />thread<br />main()<br />
  29. 29. Средства создания многопоточных программ<br />Ручные: Библиотеки потоков<br />Posix Threads<br />Windows Threads<br />…<br />Полуавтоматические: OpenMP<br />Автоматические: Распараллеливающие компиляторы<br />Неявный параллелизм (F#)<br />
  30. 30. Синхронизация потоков<br />Необходима при:<br />Совместном использовании ресурса (атомарные операции)<br />Уведомлении потоков о некотором событии<br />
  31. 31. n = количество проц.<br />Tпаралл.= {(1-P) + P/n}Tпослед<br />Закон Амдала<br />P<br />Ускорение= Tпослед/ Tпаралл.<br />P/2<br />Послед.<br />T<br />P/∞<br />(1-P)<br />(1-P)<br />Описывает верхний предел ускорения от параллельного выполнения<br />Последовательный код ограничивает ускорение<br />
  32. 32. 29<br />Parallel Programming Models<br />Functional Decomposition<br />Task parallelism<br />Divide the computation, then associate the data<br />Independent tasks of the same problem<br />Data Decomposition<br />Same operation performed on different data<br />Divide data into pieces, then associate computation <br />
  33. 33. Просто OpenMP<br />Главный поток<br />Параллельные регионы<br />Параллелизм Fork-join: <br /><ul><li>Главный поток (Master thread) порождает группу потоков по необходимости
  34. 34. Параллелизм добавляется постепенно
  35. 35. Последовательная программа “трансформируется в параллельную”</li></li></ul><li>Параллельные циклы<br />Определите циклы на вычисление которых уходит наибольшее количество времени.<br />Распределите их о выполнение между потоками.<br />Распределить цикл между потоками<br />#include “omp.h”void main(){ double Res[1000];#pragmaomp parallel forfor(inti=0;i<1000;i++){ do_huge_comp(Res[i]); }}<br />void main(){ double Res[1000]; for(inti=0;i<1000;i++){ do_huge_comp(Res[i]); }}<br />Последовательная программа<br />Параллельная программа<br />
  36. 36. Примитивы OpenMPподразделяются на категории:<br />Функции времени выполнения/переменные среды окружения<br />Параллельные регионы<br />Распределение работ<br />Синхронизация<br />Принципиально OpenMPне зависит от компилятора или языка, например Fortran и C/C++<br />Просто OpenMP<br />
  37. 37. Примитивы среды окружения:<br />Изменить/проверить количество потоков<br />omp_set_num_threads()<br />omp_get_num_threads()<br />omp_get_thread_num()<br />omp_get_max_threads()<br />Мы в параллельном регионе?<br />omp_in_parallel()<br />Сколько процессоров в системе?<br />omp_num_procs()<br />Функции<br />
  38. 38. Чтобы установить количество потоков<br />Установить количество потоков равное количеству процессоров<br />#include <omp.h>void main(){ intnum_threads;omp_set_num_threads(omp_num_procs());#pragmaomp parallel { int id=omp_get_thread_num();#pragmaomp single num_threads = omp_get_num_threads(); do_lots_of_stuff(id); }}<br />Глоб. Переменная. Операция выполняется в одном потоке.<br />Функции<br />
  39. 39. Переменные среды коружения<br />Установить количество потоков, порождаемых по умолчанию<br />OMP_NUM_THREADS int_literal<br />Установить способ распределения нагрузки по умолчанию<br />OMP_SCHEDULE “schedule[, chunk_size]”<br />
  40. 40. Правила разделения переменных<br />Неявное правило 1: Все переменные, определенныевнеomp parallel,являются глобальнымидля всех потоков<br />Неявное правило 2:Все переменные, определенныевнутриomp parallel,являются локальнымидля каждого потока<br />Неявное исключение:В прагмеomp for, счетчик циклавсегдалокалендля каждого потока<br />Явное правило 1: Переменные, приведенные вshared(),являются глобальнымидля всех потоков<br />Явное правило 2:Переменные, приведенные вprivate(),являются локальнымидля каждого потока<br />
  41. 41. Какие переменные локальные, а какие глобальные?<br />void func()<br />{<br />int a, i;<br />#pragmaomp parallel for <br /> shared(c) private(d, e)<br />for (i = 0; i < N; i++)<br />{<br />int b, c, d, e;<br />a = a + b;<br />c = c + d * e;<br />}<br />}<br />
  42. 42. Прагмы синхронизации<br />#pragmaompsingle – исполняет следующую команду толькос помощью одного (случайного) потока<br />#pragmaompbarrier – удерживает потоки в этом месте, пока все потоки не дойдут дотуда<br />#pragmaompatomic– атомарно исполняет следующую операцию доступа к памяти (т.е. без прерывания от других ветвей)<br />#pragmaompcritical [имя потока] – позволяет только одному потоку перейти к исполнению следующей команды<br />int a[N], sum = 0;<br />#pragmaomp parallel for<br />for (inti = 0; i < N; i++)<br />{<br />#pragmaomp critical<br /> sum += a[i]; // one thread at a time<br />}<br />
  43. 43. Реализация параллельного алгоритма с использованием OpenMP<br />Применяется OpenMP с помощью указания директив. Например :<br />#pragmaomp parallel for<br /> for (inti = 0; i < N; i++)<br />PerformSomeComputation(i);<br />
  44. 44. Выполнение упражнения<br />1. В папке Exercises2 OpenMPOpenMPContrastStretchнаходится копия последовательной программы. Выберите необходимую архитектуру процессора ( Win32 или 64) и включите поддержку OpenMP. Измените файл “app.h” добавив строку <br />#Include <omp.h>. Измените главную фунцию добавив строки, выводящие информацию о среде выполнения:<br />cout << " Processors: " << omp_get_num_procs() << endl;<br />cout << " Threads: " << omp_get_max_threads() << endl;<br />Откройте ContrastStretch.cpp и вставьте директивы OpenMPв цикл while<br /> while (!converged && step < steps)<br /> {<br />  #pragmaomp parallel for schedule(static)<br /> for (int row = 1; row < rows-1; row++) <br /> for (intcol = 1; col < cols-1; col++)<br /> … <br /> #pragmaomp parallel for schedule(static)<br /> for (int row = 1; row < rows-1; row++) <br /> for (intcol = 1; col < cols-1; col++)<br /> ...<br /> }<br />
  45. 45. Реализация параллельного алгоритма с использованием OpenMP<br />Поддержка OpenMP включается в Visual Studio 2005 и Visual Studio 2008. <br />Project ->Properties->Configuration Properties-> C/C++-> Language-> OpenMP Support<br />
  46. 46. Ошибка(!)<br />Гонки данных.<br />Взаимоблокировки.<br />
  47. 47. Реализация параллельного алгоритма с использованием OpenMP<br />Важно помнить про ситуацию (race conditions), которая возникает при одновременном доступе к общим переменным. <br />#pragmaomp parallel for schedule(static)<br /> for (inti = 0; i < N; i++)<br />PerformSomeComputation(i);<br />Пусть функция PerformSomeComputation изменяет значение глобальной переменной<br />int global = 0;<br />  void PerformSomeComputation(inti)<br /> {<br /> global += i;<br /> }<br />. <br />
  48. 48. Реализация параллельного алгоритма с использованием OpenMP<br />Избежать ситуацию возникновения гонки за ресурсами. Позволяет использование критических секций:<br /> void PerformSomeComputation(inti)<br /> {<br /> #pragmaomp critical<br /> {<br /> global += i;<br /> }<br /> }<br />
  49. 49. Выполнение упражнения<br />#pragmaomp parallel for schedule(static) reduction(+:diffs)<br />for (int row = 1; row < rows-1; row++) <br />

×