3. Инфраструктура Туалеты Перерывы Эвакуация != Тренеры Денис Котляров, Microsoft Василий Маланин, Microsoft Андрей Паринов, Независимый эксперт Группа поддержки
14. n = количество проц. Tпаралл.= {(1-P) + P/n}Tпослед Закон Амдала P Ускорение= Tпослед/ Tпаралл. P/2 Послед. T P/∞ (1-P) (1-P) Описывает верхний предел ускорения от параллельного выполнения Последовательный код ограничивает ускорение
15. Проведение вычислений на локальной машине Для проведения эксперимента необходимо открыть в в VS 2008 проект из папки SolutionsequentialeqContrastStretchbr />Необходимо выбрать архитектуру процессора, на которому будут провиодиться вычисления. Для проведение вычислений на кластере необходимо выбрать 64-х битную архитектуру процессора.
17. Постановка задач для кластера в HPCS Адрес MSU кластера IKI кластера HN.PRACTICUM.CS.MSU.SU 193.232.2.150 Имя головного узла (head node)hn.practicumn.cluster.local Имя вычислительных узлов cn1,cn2…cn1.cluster.local,cn2.cluster.local… Сетевая папка доступная всем hn.practicumpps hn.cluster.localpps вычислительным узлам Сетевая папка на каждом cn1pps, cn2pps... cn1.cluster.localpps вычилительном узле (физический расположенная в C:pps) Для доступа к IKI кластеру необходимо включить VPN соединение, указав User name: <user_ name> Password: < password> Domain: Cluster
22. Постановка задач для кластера в HPCS Для последовательных и OpenMPпрограмм: app.exe argument1 argument2 ... Для программы MPI: mpiexec mpiapp.exe argument1 argument2 ...
23. Постановка задач для кластера в HPCS 6) После сохранения задачи, нажмите кнопку «Submit». Должно появится окно подтверждения прав для постановки задачи. Необходимо ввести имя пользователя и пароль. Например, если имя пользователя “domainpcuser”, то окно будет иметь вид
25. Постановка задач для кластера в HPCS Для просмотра загруженности вычислительных узлов при выполнении задачи, необходимо открыть вкладку Heat Map в Windows HPC Server. Например, вид окна должен быть таким:
28. Процессы и потоки Stack Сегмент кода Сегмент данных Stack Stack thread thread … Преимущества потоков: Быстрое переключение между потоками (переключение между процессами очень ресурсоемкая операция) Простая организация взаимодействия – общая память Недостатки потоков: Некорректное использование данных одним потоком отражается на всех других Необходимость в синхронизации при доступе к общим данным Используемые библиотеки должны поддерживать многопоточность thread main()
29. Средства создания многопоточных программ Ручные: Библиотеки потоков Posix Threads Windows Threads … Полуавтоматические: OpenMP Автоматические: Распараллеливающие компиляторы Неявный параллелизм (F#)
30. Синхронизация потоков Необходима при: Совместном использовании ресурса (атомарные операции) Уведомлении потоков о некотором событии
31. n = количество проц. Tпаралл.= {(1-P) + P/n}Tпослед Закон Амдала P Ускорение= Tпослед/ Tпаралл. P/2 Послед. T P/∞ (1-P) (1-P) Описывает верхний предел ускорения от параллельного выполнения Последовательный код ограничивает ускорение
32. 29 Parallel Programming Models Functional Decomposition Task parallelism Divide the computation, then associate the data Independent tasks of the same problem Data Decomposition Same operation performed on different data Divide data into pieces, then associate computation
36. Примитивы OpenMPподразделяются на категории: Функции времени выполнения/переменные среды окружения Параллельные регионы Распределение работ Синхронизация Принципиально OpenMPне зависит от компилятора или языка, например Fortran и C/C++ Просто OpenMP
37. Примитивы среды окружения: Изменить/проверить количество потоков omp_set_num_threads() omp_get_num_threads() omp_get_thread_num() omp_get_max_threads() Мы в параллельном регионе? omp_in_parallel() Сколько процессоров в системе? omp_num_procs() Функции
38. Чтобы установить количество потоков Установить количество потоков равное количеству процессоров #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); }} Глоб. Переменная. Операция выполняется в одном потоке. Функции
39. Переменные среды коружения Установить количество потоков, порождаемых по умолчанию OMP_NUM_THREADS int_literal Установить способ распределения нагрузки по умолчанию OMP_SCHEDULE “schedule[, chunk_size]”
40. Правила разделения переменных Неявное правило 1: Все переменные, определенныевнеomp parallel,являются глобальнымидля всех потоков Неявное правило 2:Все переменные, определенныевнутриomp parallel,являются локальнымидля каждого потока Неявное исключение:В прагмеomp for, счетчик циклавсегдалокалендля каждого потока Явное правило 1: Переменные, приведенные вshared(),являются глобальнымидля всех потоков Явное правило 2:Переменные, приведенные вprivate(),являются локальнымидля каждого потока
41. Какие переменные локальные, а какие глобальные? void func() { int a, i; #pragmaomp parallel for br /> shared(c) private(d, e) for (i = 0; i < N; i++) { int b, c, d, e; a = a + b; c = c + d * e; } }
42. Прагмы синхронизации #pragmaompsingle – исполняет следующую команду толькос помощью одного (случайного) потока #pragmaompbarrier – удерживает потоки в этом месте, пока все потоки не дойдут дотуда #pragmaompatomic– атомарно исполняет следующую операцию доступа к памяти (т.е. без прерывания от других ветвей) #pragmaompcritical [имя потока] – позволяет только одному потоку перейти к исполнению следующей команды int a[N], sum = 0; #pragmaomp parallel for for (inti = 0; i < N; i++) { #pragmaomp critical sum += a[i]; // one thread at a time }
43. Реализация параллельного алгоритма с использованием OpenMP Применяется OpenMP с помощью указания директив. Например : #pragmaomp parallel for for (inti = 0; i < N; i++) PerformSomeComputation(i);
44. Выполнение упражнения 1. В папке Exercises2 OpenMPpenMPContrastStretchаходится копия последовательной программы. Выберите необходимую архитектуру процессора ( Win32 или 64) и включите поддержку OpenMP. Измените файл “app.h” добавив строку #Include <omp.h>. Измените главную фунцию добавив строки, выводящие информацию о среде выполнения: cout << " Processors: " << omp_get_num_procs() << endl; cout << " Threads: " << omp_get_max_threads() << endl; Откройте ContrastStretch.cpp и вставьте директивы OpenMPв цикл while while (!converged && step < steps) { #pragmaomp parallel for schedule(static) for (int row = 1; row < rows-1; row++) for (intcol = 1; col < cols-1; col++) … #pragmaomp parallel for schedule(static) for (int row = 1; row < rows-1; row++) for (intcol = 1; col < cols-1; col++) ... }
45. Реализация параллельного алгоритма с использованием OpenMP Поддержка OpenMP включается в Visual Studio 2005 и Visual Studio 2008. Project ->Properties->Configuration Properties-> C/C++-> Language-> OpenMP Support
47. Реализация параллельного алгоритма с использованием OpenMP Важно помнить про ситуацию (race conditions), которая возникает при одновременном доступе к общим переменным. #pragmaomp parallel for schedule(static) for (inti = 0; i < N; i++) PerformSomeComputation(i); Пусть функция PerformSomeComputation изменяет значение глобальной переменной int global = 0; void PerformSomeComputation(inti) { global += i; } .
48. Реализация параллельного алгоритма с использованием OpenMP Избежать ситуацию возникновения гонки за ресурсами. Позволяет использование критических секций: void PerformSomeComputation(inti) { #pragmaomp critical { global += i; } }
Типы:Функциональный и поданным.Явный/явный.Крапнозернистый.мелкозернистый.Ускорение –> то ради чего все делается, главный параметр для определения глубины распараллеливания.Инструменты. Распараллеливание –> Автоматическое, Полуавтоматическое, Ручное. Вся суть параллелизма с точки дрения инструментов – обеспечение параллельной обработки данных, в средах с обще памятью, распределенных, смешанных, гомогенных, гетерогенных (грид системы).
Открываем код.Внимательно рассказать структуре данных, методах ContrastStretch, median и StretchColor.Последовательная программа алгоритма изменения контрастности находится в папке SolutionsSequentialSeqContrastStretch. Проект состоит из файлов с кодом:Bitmap.cpp исходный код для чтения записи .bmp файловContrastStretch.cpp код реализующий преобразование графических файловMain.cpp главная часть программы (запуск, обработка входных аргументов, чтениезапись файлов и преобразования над ними)
Запускаем на кластере, замеряем время, то три запуска, считаем ускорение.
Три вида распараллеливания – ручное, полуручное, машинное. OpenMP пример полуручного распараллеливания.В основе OpenMPлежит идея взаимодействия процессов под названием fork-join. Идея fork-joinзаключается в том, что в начале программы существуют только один основной процесс. Когда программы достигает раздела кода, который должен выполнятся параллельно, основной процесс разбивается на 2 или более процессов и выполняется на предписанном для него вычислительном узле. Когда каждый процесс выполняет все вычисления, он ждет когда другие закончат вычисления. Когда все процессы заканчивают вычисления, они собираются обратно в один процессOpenMP - это открытый стандарт для описания взаимодействия процессов при использовании машин с общей памятью. Более подробную информацию можно найти по адресу http://www.openmp.org