20090720 hpc exercise1

33
Основы разработки высокопроизводительных параллельных приложений. Практикум. Департамент стратегических технологий, Microsoft .

Transcript of 20090720 hpc exercise1

Page 1: 20090720 hpc exercise1

Основы разработки

высокопроизводительных

параллельных приложений.

Практикум.

Департамент стратегических технологий,

Microsoft.

Page 2: 20090720 hpc exercise1

Содержание

Время Тема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.

Page 3: 20090720 hpc exercise1

Инфраструктура

• Туалеты• Перерывы• Эвакуация !=

Тренеры

Денис Котляров, MicrosoftВасилий Маланин, MicrosoftАндрей Паринов, Независимый экспертГруппа поддержки

Page 4: 20090720 hpc exercise1
Page 5: 20090720 hpc exercise1
Page 6: 20090720 hpc exercise1

Часть 1. Введение в параллелизм. Многопоточное программирование.

Page 7: 20090720 hpc exercise1

Введение

- Зачем?- Типы параллелизма.- Ускорение -> Эффективность vs Переносимость- Распараллеливание = Инструменты && (Предметные области || Задачи)

Page 8: 20090720 hpc exercise1

Описание предметной области

Page 9: 20090720 hpc exercise1

Описание предметной области

800

600

Page 10: 20090720 hpc exercise1

Описание предметной области

Page 11: 20090720 hpc exercise1

n = количество проц.

Tпаралл. = {(1-P) + P/n} Tпослед

Ускорение = Tпослед / Tпаралл.

Закон Амдала• Описывает верхний предел ускорения от

параллельного выполнения

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

(1-

P)

P

T Посл

ед

.

(1-

P)

P/2

P/∞

Page 12: 20090720 hpc exercise1

Постановка задач для кластера в 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

Page 13: 20090720 hpc exercise1

WHPCS

Page 14: 20090720 hpc exercise1

Последовательно о многопоточном.

Page 15: 20090720 hpc exercise1

Процессы и потокиПреимущества потоков:• Быстрое переключение между потоками

(переключение между процессами очень ресурсоемкая операция)

• Простая организация взаимодействия – общая память

Недостатки потоков:• Некорректное использование данных

одним потоком отражается на всех других• Необходимость в синхронизации при

доступе к общим данным• Используемые библиотеки должны

поддерживать многопоточность

Сегмент кода

Сегмент данных

thread

main()

…thread thread

Stack Stack

Stack

Page 16: 20090720 hpc exercise1

Средства создания многопоточных программ

• Ручные: Библиотеки потоков– Posix Threads– Windows Threads– …

• Полуавтоматические: OpenMP• Автоматические: Распараллеливающие

компиляторы• Неявный параллелизм (F#)

Page 17: 20090720 hpc exercise1

Синхронизация потоков

Необходима при:• Совместном использовании

ресурса (атомарные операции)

• Уведомлении потоков о некотором событии

Interlocked-функции

Критические секцииМьютексы

События

Семафоры

Page 18: 20090720 hpc exercise1

n = количество проц.

Tпаралл. = {(1-P) + P/n} Tпослед

Ускорение = Tпослед / Tпаралл.

Закон Амдала• Описывает верхний предел ускорения от

параллельного выполнения

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

(1-

P)

P

T Посл

ед

.

(1-

P)

P/2

P/∞

Page 19: 20090720 hpc exercise1

Просто OpenMP

Параллелизм Fork-join:

• Главный поток (Master thread) порождает группу потоков по необходимости

• Параллелизм добавляется постепенно– Последовательная программа “трансформируется в параллельную”

Параллельные регионы

Главный поток

Page 20: 20090720 hpc exercise1

Параллельные циклы

• Определите циклы на вычисление которых уходит наибольшее количество времени.

• Распределите их о выполнение между потоками.

#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]); }}

Распределить цикл между потоками

Последовательная программа Параллельная программа

Page 21: 20090720 hpc exercise1

• Примитивы OpenMP подразделяются на категории:– Функции времени выполнения/переменные среды

окружения– Параллельные регионы– Распределение работ – Синхронизация

• Принципиально OpenMP не зависит от компилятора или языка, например Fortran и C/C++

Просто OpenMP

Page 22: 20090720 hpc exercise1

• Примитивы среды окружения:• Изменить/проверить количество потоков

– omp_set_num_threads()– omp_get_num_threads()– omp_get_thread_num()– omp_get_max_threads()

• Мы в параллельном регионе?– omp_in_parallel()

• Сколько процессоров в системе?– omp_num_procs()

Функции

Page 23: 20090720 hpc exercise1

• Чтобы установить количество потоков

#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); }}

Функции

Установить количество потоков равное количеству процессоров

Глоб. Переменная. Операция выполняется в одном потоке.

Page 24: 20090720 hpc exercise1

• Установить количество потоков, порождаемых по умолчанию– OMP_NUM_THREADS int_literal

• Установить способ распределения нагрузки по умолчанию– OMP_SCHEDULE “schedule[, chunk_size]”

Переменные среды коружения

Page 25: 20090720 hpc exercise1

Правила разделения переменных• Неявное правило 1: Все переменные, определенные вне omp parallel, являются глобальными для всех потоков

• Неявное правило 2: Все переменные, определенные внутри omp parallel, являются локальными для каждого потока

• Неявное исключение: В прагме omp for, счетчик цикла всегда локален для каждого потока

• Явное правило 1: Переменные, приведенные в shared(), являются глобальными для всех потоков

• Явное правило 2: Переменные, приведенные в private(), являются локальными для каждого потока

Page 26: 20090720 hpc exercise1

Какие переменные локальные, а какие глобальные?

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;

}}

Page 27: 20090720 hpc exercise1

Прагмы синхронизации• #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

}

Page 28: 20090720 hpc exercise1

Реализация параллельного алгоритма с использованием OpenMP

Применяется OpenMP с помощью указания директив. Например :#pragma omp parallel for

for (int i = 0; i < N; i++)PerformSomeComputation(i);

Page 29: 20090720 hpc exercise1

Реализация параллельного алгоритма с использованием 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;}

.

Page 30: 20090720 hpc exercise1

Реализация параллельного алгоритма с использованием OpenMPИзбежать ситуацию возникновения гонки за ресурсами. Позволяет

использование критических секций:void PerformSomeComputation(int i){

#pragma omp critical{

global += i;}

}

Page 31: 20090720 hpc exercise1

Выполнение упражнения

#pragma omp parallel for schedule(static) reduction(+:diffs) for (int row = 1; row < rows-1; row++)

Page 32: 20090720 hpc exercise1
Page 33: 20090720 hpc exercise1