Анализ и оптимизация на софтуерни приложения

Подобни документи
Анализ и оптимизация на софтуерни приложения

Анализ и оптимизация на софтуерни приложения

Анализ и оптимизация на софтуерни приложения

Анализ и оптимизация на софтуерни приложения

Lush Green

Анализ и оптимизация на софтуерни приложения

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Структура на програма в C - Част 2 - типове, функции

C++

Анализ и оптимизация на софтуерни приложения

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

ПРОГРАМНО ОСИГУРЯВАНЕ НА КОМПЮТЪРА

Виртуални функции

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

Машинно обучение - въведение

Програмиране на Паскал

Lush Green

Линейна алгебра 7. Умножение на матрици. Обратими матрици. Матрични уравнения специалности: Математика, Бизнес математика, Приложна математика, I курс

Slide 1

Компютърна Графика и Презентации - Алгоритми за Визуализация

Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Споделяне на анонимни данни с Lenovo Съдържание Споделяне на анонимни данни с Lenovo... 1 Harmony... 1 Lenovo Companion Lenovo Customer Engag

Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

Системи за управление на версии - Работа с git

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари

Проф

Софийски университет Св. Климент Охридски Факултет по математика и информатика Курсов проект по Системи за паралелна обработка Тема: Изобразяване на ф

СТАНОВИЩЕ

Структура на програма в C - Част 6 - goto, switch, break и continue клаузи

10. Линейни оптимизационни модели – обща постановка

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Компютърна Графика и Презентации - Графично моделиране

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

Microsoft Word - VypBIOL-08-ZZ-Energiata.doc

Black and White

4

I

doll Механична кукла Механичните кукли автоматично повтарят предварително зададена последователност от движения. В Япония има традиции в изработката н

Анализ и оптимизация на софтуерни приложения

Препис:

Анализ и оптимизация на софтуерни приложения Александър Пенев Васил Василев

Съдържание 1. Какво е паралелизация? 2. Примери 3. Паралелни алгоритми 4. Синхронизация. Критични секции 5. Проблеми при паралелните алгоритми 6. Решения. Алгоритми без заключване 2/19

Какво е паралелизация? (parallelization) е процес на преобразуване на програма изпълняваща стъпките на алгоритмите си последователно в програма изпълняваща ги (там където е възможно) паралелно/едновременно Паралелното изпълнение може да е с използването на SIMD инструкции (векторизация), много нишки, много процеси, много компютри Обикновено се използва повече от едно ядро/процесор 3/19

Какво е паралелизация? A B A B 4/19

Защо? Преди (70-те години на миналия век) Intel 8086 Сега (2015 г.) GPGPU: Intel Xeon Phi / nvidia Tesla Intel i7 Процесор Datacenters 5/19

Как се използва PThreads Threading Building Blocks (TBB) Cilk++ OpenMP OpenCL, CUDA... 6/19

Пример 1 int fib(int n) { if (n < 2) return n; Указание за компилатора int n1, n2; #pragma omp task shared(n1) n1 = fib(n - 1); #pragma omp task shared(n2) n2 = fib(n - 2); #pragma omp taskwait return n1 + n2; } Ако компилатора не поддържа автоматична паралелизация (OpenMP), то програмата се компилира както до сега 7/19

Пример анализ fib(4) fib(3) fib(2) fib(2) fib(1) fib(1) fib(0) 8/19

Важни характеристики TP Времето за изпълнение на P процесора Времето за изпълнение на алгоритъма на повече от един процесор може да съвпада с това за изпълнението на повече процесори, ако алгоритъма не е паралелизиран T Време за изпълнение на т.н. критичен път Може да смятаме че критичния път е възможно най-бавния възможен път за изпълнение на алгоритъма. Това време се нарича още период (span) T1 Време за изпълнение на 1 процесор Без паралелни изпълнения, независимо дали програмата е паралелизирана или не. Това време се нарича още работа (work) TP T1/P TP T 9/19

Времена на паралелен алгоритъм A B T1(A B) = T1(A) + T1(B) T (A B) = T (A) + T (B) 10/19

Времена на паралелен алгоритъм A B T1(A B) = T1(A) + T1(B) T (A B) = max(t (A), T (B)) 11/19

Фактор на ускорение Фактор на ускорение на P процесора се нарича T1 / TP Линейно при T1/TP = k*p Перфектно линейно при T1/TP = P Супер линейно при T1/TP > P Невъзможно? На практика е възможно поради наличие на Кеш паметта и други фактори... 12/19

Паралелизъм Коефициент на паралелизъм се нарича T1 / T За fib(4) имаме Паралелизъм 17/8 = 2.125 Използването на повече от 2 процесора няма да даде съществено подобрение За умножение на матрици 1000x1000 имаме Паралелизъм 106 В зависимост от реализацията паралелизма може да достигне и 10 7 За един нормален RayTracer (при сцена 1000х1000 пиксела) имаме Паралелизъм 106 Много груба оценка и то за не рекурсивен RayTracer. На практика може да е и много по-голяма 13/19

Пример 2 Може да възникне проблем при паралелно изпълнение void add(hashtable table, value v) { int h = hash(v.key); v.next = table[h].next; table[h].next = &v; } h1 = hash(x.key); x.next = table[h1].next; h2 = hash(y.key); y.next = table[h2].next; table[h1].next = &x; table[h2].next = &y; Какъв е проблемът тук? 14/19

Пример 2 използване на критична секция Критична секция void add(hashtable table, value v) { int h = hash(v.key); mutex m; m.lock(); v.next = table[h].next; table[h].next = &v; m.unlock(); } h1 = hash(x.key); m.lock(); x.next = table[h1].next; table[h1].next = &x; m.unlock(); h2 = hash(y.key); m.lock(); y.next = table[h2].next; table[h2].next = &y; m.unlock(); Няма проблем при h1=h2, обаче... Какъв е проблема при тази реализация на критичната секция? 15/19

Пример 2 по-добро използване на к.с. void add(hashtable table, value v) { int h = hash(v.key); table[h].mutex.lock(); v.next = table[h].next; table[h].next = &v; table[h].mutex.unlock(); } h1 = hash(x.key); table[h1].mutex.lock(); x.next = table[h1].next; table[h1].next = &x; table[h1].mutex.unlock(); h2 = hash(y.key); table[h2].mutex.lock(); y.next = table[h2].next; table[h2].next = &y; table[h2].mutex.unlock(); Така е по-добре, защото няма заключване при h1 h2 16/19

Извод Внимателно с критичните секции! 17/19

Други опасности и проблеми Мъртва хватка (deadlock) Два или повече процеси взаимно се изчакват за достъп до общи ресурси, като всички попадат в изчакващо състояние Жива хватка (livelock) Два или повече процеси взаимно се изчакват за достъп до общи ресурси, като за разлика от мъртвата хватка те не са в изчакващо състояние, а активно се опитват да получат ресурсите без да извършват никаква друга полезна работа Конвоиране (convoying) За разлика от мъртвата хватка процесите не се блокират и работят, но непрекъснато се изчакват един друг, като въпреки че вършат и полезна работа, то тя е много малко, което води до драстично падане на производителността. Например може да се получи, че процесите чакат един от тях, а той изчаква нов квант време за да продължи работата си Съперничество (contention) Проблеми с общността на заключването: Ред вместо таблица, клетка вместо ред... Допълнително време (overhead) Понякога времето за изпълнение на организационните дейности по паралелизация, критични секции и други е прекалено много в сравнение с алгоритъма Трудни за отриване и отстраняване на грешки 18/19

Решения Използване на свободни от заключване структури Използване на високо паралелни алгоритми Transactional memory Read-Copy-Update (RCU) Map-Reduce алгоритми И много други... 19/19