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

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

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

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

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

C++

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

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

Логаритмична регресия

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

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

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

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

Homework 2

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

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Microsoft PowerPoint - Ppt ppt [Read-Only]

Проф

Lush Green

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

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

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

Kontrolno 5, variant 1

Slide 1

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

4

Lush Green

Управление на перална машина с размита логика Пералните машини в наши дни са обикновен уред в дома. Най-голяма изгода, която потребителя получава от п

Лабораторно упражнение 6 Тема: Оператори за цикли в езика C++. Реализиране на циклични алгоритми I. Цел на лабораторното упражнение Да се затвърдят зн

Microsoft Word - Sem03+04sup_KH_VM2-11.doc

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

Slide 1

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

Годишното тематично разпределение по Компютърно моделиране за 4. клас N седмица Тема очаквани резултати Методи бележки и коментари Първи учебен срок Т

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

Маисви

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

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

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

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

Информатика

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

В тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операц

При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и

Препис:

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

Съдържание 1. Какво е векторизация? 2. Примери 3. на цикли 4. Масиви от структури или структури от масиви 5. на при различни типове 2/12

Какво е векторизация? (vectorization) е процес на преобразуване на програма изпълняваща една операция за всеки такт от време (в една нишка) към програма изпълняваща няколко операции едновременно в един такт (в една нишка) та е частен случай на паралелизацията Обикновено се използват SIMD инструкциите на съвременните процесори (MMX, SSE, AVX, AltiVec, NEON,...) 3/12

Как се прилага Ръчно Ръчно с използване на intrinsic функции Автоматично от компилатора Обикновено компилатора трябва да бъде подпомогнат от нас Автоматично от процесора Като част от скаларните и супер-скаларните архитектури 4/12

Пример 1 for (i = 0; i < 1024; i++) C[i] = A[i] + B[i]; на цикли for (i = 0; i < 1024; i+=4) (C[i], C[i+1], C[i+2], C[i+3]) = (A[i], A[i+1], A[i+2], A[i+3]) + (B[i], B[i+1], B[i+2], B[i+3]); псевдокод Частично развиване на цикъл. Може ли границите на цикъла да не са кратни на 4? 5/12

Пример 2 for (i = 0; i < MAX; i++) C[i].x = A[i].x + B[i].x; C[i].y = A[i].y + B[i].y; C[i].z = A[i].z + B[i].z; в блок for (i = 0; i < MAX; i++) (C[i].x, C[i].y, C[i].z) = (A[i].x, A[i].y, A[i].z) + (B[i].x, B[i].y, B[i].z); псевдокод Ако дължината на вектора е 4, то в примера има проблем с непълното използване на SIMD възможностите 6/12

Пример 3 for (i = 0; i < 1024; i++) if (A[i] > 0) C[i] = B[i]; else D[i] = D[i-1]; на разклонени алгоритми for (i = 0; i < 1024; i++) P = A[i] > 0; NP =!P; C[i] = B[i]; (P) // изпълнява се само ако P е истина D[i] = D[i-1]; (NP) // изпълнява се само ако NP е истина псевдокод for (i = 0; i < 1024; i+=4) vp = (A[i], A[i+1], A[i+2], A[i+3]) > (0, 0, 0, 0); vnp =!vp; // векторно т.е. покомпонентно отрицание (C[i], C[i+1], C[i+2], C[i+3]) = vsel(vp, (B[i], B[i+1], B[i+2], B[i+3]), (C[i], C[i+1], C[i+2], C[i+3])); if (vnp[4]) D[i+3] = D[i+2]; if (vnp[3]) D[i+2] = D[i+1]; if (vnp[2]) D[i+1] = D[i]; if (vnp[1]) D[i] = D[i-1]; 7/12 псевдокод

Пример 3 Векторна ф-я vsel(p, A, B) p 3 p 2 p 1 p 0 P???? a 3 a 2 a 1 a 0 A : : : : b 3 b 2 b 1 b 0 B p 3?a 3 :b 3 p 2?a 2 :b 2 p 1?a 1 :b 1 p 0?a 0 :b 0 8/12

на цикли общ случай Всеки цикъл се развива до определено ниво (зависи от границите т.е. дали са известни по време на компилация и колко са големи). Циклите се разделят на 4 части (или по-малко): Пред цикъл Операции независими от цикъла (инварианти). Обикновено се зареждат (инвариантни) данни във векторни регистри и други Цикъл (Цикли) Векторизирани вариант(и) на цикъла (циклите) След цикъл Получаване на резултати и допълнителна инварианта обработка Индукции, редукции и други Опашка на цикъл Реализация на невекторизиран вариант на цикъла за оставащите итерации, които по някакви причини не са попаднали в основния цикъл (например броя итерации не е кратен на големината на векторите или размера се определя в runtime) 9/12

Не всичко може да се векторизира for (i = 0; i < 3; i++) C[i] = A[i] + B[i]; OK. Цикълът може да бъде развит и/или векторизиран напълно for (i = 0; i < 1024; i++) C[i] = A[i] + B[i]; OK. Цикълът може да бъде векторизиран for (i = 0; i < 1024; i++) D[i] = E[i] - A[i-1]; A[i] = B[i] + C[i]; Не може! Използва се стойност преди да бъде пресметната 10/12

Масив от структури или няколко масива?? z i y i x i v1 struct float x, y, z; vec; vec[100] v1, v2; + + + +? z i y i x i v2 for (i = 0; i < 100; i++) v1[i].x += v2[i].x; v1[i].y += v2[i].y; v1[i].z += v2[i].z; или x i+3 x i+2 x i+1 x i v1x float[100] v1x, v2x; float[100] v1y, v2y; float[100] v1z, v2z; + + + + x i+3 x i+2 x i+1 x i v2x for (i = 0; i < 100; i++) v1x[i] += v2x[i]; for (i = 0; i < 100; i++) v1y[i] += v2y[i]; for (i = 0; i < 100; i++) v1z[i] += v2z[i]; 11/12

Типове данни Ако типа е еднакъв Например 4 float числа се събират точно в един SSE регистър float float float float double double int32 int32 int32 int32 Ако типовете са различни Имаме загуба на производителност. Трябва да се внимава с Align на структурите За някои типове може да се налага разширяване до по-голям тип (float->double) float double int32 int32 short int32 12/12