20090720 hpc exercise1
-
Upload
michael-karpov -
Category
Technology
-
view
603 -
download
1
Transcript of 20090720 hpc exercise1
Основы разработки
высокопроизводительных
параллельных приложений.
Практикум.
Департамент стратегических технологий,
Microsoft.
Содержание
Время Тема20.07.0918-00 – 19-00
Часть 1. Введение в параллелизм (коротко). Знакомство с WHPC. Знакомство с примером. Запуск первой программы на кластере. Распараллеливание задачи. Многопоточное программирование.
21.07.0915-00 – 16-00
Часть 2. Первая программа на MPI. Распараллеливание задачи на MPI.
23.07.0915-00 – 16-00
Часть 3. Отладка параллельных программ. Оптимизация параллельных приложений. Параллелизм в управляемом коде, MPI.NET.
Инфраструктура
• Туалеты• Перерывы• Эвакуация !=
Тренеры
Денис Котляров, MicrosoftВасилий Маланин, MicrosoftАндрей Паринов, Независимый экспертГруппа поддержки
Часть 1. Введение в параллелизм. Многопоточное программирование.
Введение
- Зачем?- Типы параллелизма.- Ускорение -> Эффективность vs Переносимость- Распараллеливание = Инструменты && (Предметные области || Задачи)
Описание предметной области
Описание предметной области
800
600
Описание предметной области
n = количество проц.
Tпаралл. = {(1-P) + P/n} Tпослед
Ускорение = Tпослед / Tпаралл.
Закон Амдала• Описывает верхний предел ускорения от
параллельного выполнения
Последовательный код ограничивает ускорение
(1-
P)
P
T Посл
ед
.
(1-
P)
P/2
P/∞
Постановка задач для кластера в HPCS
Адрес MSU кластера \ IKI кластера HN.PRACTICUM.CS.MSU.SU \ 193.232.2.150Имя головного узла (head node) hn.practicum\hn.cluster.localИмя вычислительных узлов cn1,cn2…\ cn1.cluster.local,cn2.cluster.local…Сетевая папка доступная всем hn.practicum\apps \ hn.cluster.local\appsвычислительным узламСетевая папка на каждом \\cn1\Apps, \\cn2\Apps... \ cn1.cluster.local\
appsвычилительном узле(физический расположенная в C:\Apps)
Для доступа к IKI кластеру необходимо включить VPN соединение, указав User name: <user_ name>Password: < password>Domain: Cluster
WHPCS
Последовательно о многопоточном.
Процессы и потокиПреимущества потоков:• Быстрое переключение между потоками
(переключение между процессами очень ресурсоемкая операция)
• Простая организация взаимодействия – общая память
Недостатки потоков:• Некорректное использование данных
одним потоком отражается на всех других• Необходимость в синхронизации при
доступе к общим данным• Используемые библиотеки должны
поддерживать многопоточность
Сегмент кода
Сегмент данных
thread
main()
…thread thread
Stack Stack
Stack
Средства создания многопоточных программ
• Ручные: Библиотеки потоков– Posix Threads– Windows Threads– …
• Полуавтоматические: OpenMP• Автоматические: Распараллеливающие
компиляторы• Неявный параллелизм (F#)
Синхронизация потоков
Необходима при:• Совместном использовании
ресурса (атомарные операции)
• Уведомлении потоков о некотором событии
Interlocked-функции
Критические секцииМьютексы
События
Семафоры
n = количество проц.
Tпаралл. = {(1-P) + P/n} Tпослед
Ускорение = Tпослед / Tпаралл.
Закон Амдала• Описывает верхний предел ускорения от
параллельного выполнения
Последовательный код ограничивает ускорение
(1-
P)
P
T Посл
ед
.
(1-
P)
P/2
P/∞
Просто OpenMP
Параллелизм Fork-join:
• Главный поток (Master thread) порождает группу потоков по необходимости
• Параллелизм добавляется постепенно– Последовательная программа “трансформируется в параллельную”
Параллельные регионы
Главный поток
Параллельные циклы
• Определите циклы на вычисление которых уходит наибольшее количество времени.
• Распределите их о выполнение между потоками.
#include “omp.h”void main(){ double Res[1000];#pragma omp parallel for for(int i=0;i<1000;i++){
do_huge_comp(Res[i]); }}
void main(){ double Res[1000]; for(int i=0;i<1000;i++){
do_huge_comp(Res[i]); }}
Распределить цикл между потоками
Последовательная программа Параллельная программа
• Примитивы OpenMP подразделяются на категории:– Функции времени выполнения/переменные среды
окружения– Параллельные регионы– Распределение работ – Синхронизация
• Принципиально OpenMP не зависит от компилятора или языка, например Fortran и C/C++
Просто OpenMP
• Примитивы среды окружения:• Изменить/проверить количество потоков
– omp_set_num_threads()– omp_get_num_threads()– omp_get_thread_num()– omp_get_max_threads()
• Мы в параллельном регионе?– omp_in_parallel()
• Сколько процессоров в системе?– omp_num_procs()
Функции
• Чтобы установить количество потоков
#include <omp.h>void main(){ int num_threads; omp_set_num_threads(omp_num_procs());#pragma omp parallel { int id=omp_get_thread_num();#pragma omp single num_threads = omp_get_num_threads(); do_lots_of_stuff(id); }}
Функции
Установить количество потоков равное количеству процессоров
Глоб. Переменная. Операция выполняется в одном потоке.
• Установить количество потоков, порождаемых по умолчанию– OMP_NUM_THREADS int_literal
• Установить способ распределения нагрузки по умолчанию– OMP_SCHEDULE “schedule[, chunk_size]”
Переменные среды коружения
Правила разделения переменных• Неявное правило 1: Все переменные, определенные вне omp parallel, являются глобальными для всех потоков
• Неявное правило 2: Все переменные, определенные внутри omp parallel, являются локальными для каждого потока
• Неявное исключение: В прагме omp for, счетчик цикла всегда локален для каждого потока
• Явное правило 1: Переменные, приведенные в shared(), являются глобальными для всех потоков
• Явное правило 2: Переменные, приведенные в private(), являются локальными для каждого потока
Какие переменные локальные, а какие глобальные?
void func(){
int a, i;#pragma omp parallel for \
shared(c) private(d, e)for (i = 0; i < N; i++){
int b, c, d, e;a = a + b;c = c + d * e;
}}
Прагмы синхронизации• #pragma omp single – исполняет следующую команду только с
помощью одного (случайного) потока• #pragma omp barrier – удерживает потоки в этом месте, пока
все потоки не дойдут дотуда• #pragma omp atomic – атомарно исполняет следующую
операцию доступа к памяти (т.е. без прерывания от других ветвей)• #pragma omp critical [имя потока] – позволяет только
одному потоку перейти к исполнению следующей команды
int a[N], sum = 0;#pragma omp parallel forfor (int i = 0; i < N; i++){
#pragma omp criticalsum += a[i]; // one thread at a time
}
Реализация параллельного алгоритма с использованием OpenMP
Применяется OpenMP с помощью указания директив. Например :#pragma omp parallel for
for (int i = 0; i < N; i++)PerformSomeComputation(i);
Реализация параллельного алгоритма с использованием OpenMP
Важно помнить про ситуацию (race conditions), которая возникает при одновременном доступе к общим переменным.
#pragma omp parallel for schedule(static)for (int i = 0; i < N; i++)
PerformSomeComputation(i);Пусть функция PerformSomeComputation изменяет значение глобальной
переменнойint global = 0;
void PerformSomeComputation(int i){
global += i;}
.
Реализация параллельного алгоритма с использованием OpenMPИзбежать ситуацию возникновения гонки за ресурсами. Позволяет
использование критических секций:void PerformSomeComputation(int i){
#pragma omp critical{
global += i;}
}
Выполнение упражнения
#pragma omp parallel for schedule(static) reduction(+:diffs) for (int row = 1; row < rows-1; row++)