Оптимізувальний компілятор — компілятор, в якому використовуються різні методи отримання оптимального програмного коду при збереженні його функціональних можливостей. Найбільш поширені цілі оптимізації: скорочення часу виконання програми, підвищення продуктивності, компактифікація програмного коду, економія пам'яті, мінімізація енерговитрат, зменшення кількості операцій (введення-виведення).
Оптимізація може відбуватися неявно під час трансляції програми, але, як правило, вважається окремим етапом роботи компілятора. Компонувальники також можуть виконувати частину оптимізацій, таких як вилучення невикористовуваних підпрограм або їх .
Оптимізація, як правило, реалізується за допомогою послідовності оптимізувальних перетворень, алгоритмів, які приймають програму і змінюють її для отримання семантично еквівалентного варіанту, але більш ефективного з точки зору деякого набору цілей оптимізації. Було показано, що деякі проблеми оптимізації коду є NP-повними, або навіть нерозв'язними. Проте, практично багато з них вирішуються наближеними методами, що дають цілком задовільні результати.
Розрізняють низько- і високорівневу оптимізацію. Низькорівнева оптимізація перетворює програму на рівні елементарних команд, наприклад, інструкцій процесора конкретної [en]. Високорівнева оптимізація здійснюється на рівні структурних елементів програми, таких як модулі, функції, розгалуження, цикли.
Типи оптимізацій
Методи, використовувані для оптимізації, можуть бути класифіковані за сферою застосування: вони можуть впливати як на окремий оператор, так і на цілу програму. Локальні методи (зачіпають невелику частину програми) простіше реалізувати, ніж глобальні (застосовувані до всієї програми), але при цьому глобальні методи часто виявляються більш вигідними.
Peephole-оптимізація
Локальні peephole-оптимізації (англ. peephole — «вічко») розглядають кілька сусідніх (в термінах одного з графів подання програми) інструкцій (як ніби «дивиться у вічко» на код), щоб побачити, чи можна їх якось трансформувати з метою оптимізації. Зокрема, вони можуть бути замінені однією інструкцією або коротшою послідовністю інструкцій.
Наприклад, подвоєння числа може бути більш ефективно виконане з використанням лівого зсуву або шляхом додавання числа з таким самим.
Локальна оптимізація
В локальній оптимізації за один крок розглядається тільки інформація одного базового блоку:404</ref>. Оскільки в базових блоках немає переходів потоку управління, така оптимізація вимагає незначного аналізу (заощаджуючи час і знижуючи вимоги до пам'яті), але це також означає, що не зберігається інформація для наступного кроку.
Внутрішньопроцедурна оптимізація
Внутрішньопроцедурні оптимізації (англ. intraprocedural — глобальні оптимізації, що виконуються цілком в рамках одиниці трансляції (наприклад, функції або процедури):407. За такої оптимізації опрацьовується значно більше інформації, ніж за локальної, що дозволяє досягати більш значного ефекту, але при цьому часто потрібні ресурсовитратні обчислення. За наявності у оптимізовуваній програмній одиниці глобальних змінних оптимізація такого виду може бути утруднена.
Оптимізація циклів
Існує значна кількість оптимізацій, що застосовуються до циклів. За великої кількості повторень циклу такі оптимізації надзвичайно ефективні, оскільки невеликим перетворенням впливають на значну частину виконання програми. Оскільки цикли — вагома частина часу виконання багатьох програм, оптимізації циклів існують практично у всіх компіляторах і є найважливішими.
Наприклад, виявивши [ru], іноді можна винести частину операцій з циклу, щоб не виконувати надлишкових повторних обчислень.
Міжпроцедурна оптимізація
Такі види оптимізацій аналізують відразу весь сирцевий код програми. Більша кількість інформації, що отримується даними методами, означає що оптимізації можуть бути більш ефективними в порівнянні з іншими методами. Такі оптимізації можуть використовувати досить складні методи, наприклад, виклик функції заміщається копією тіла функції (вбудовування або inline).
Приклад Нехай є деяка функція:
int pred(int x) { if (x == 0) return 0; else return x - 1; }
До її вбудовування код виглядав так:
int f(int y) { return pred(y) + pred(0) + pred(y+1); }
Після оптимізації:
int f(int y) { int temp = 0; if (y == 0) temp += 0; else temp += y - 1; /* (1) */ if (0 == 0) temp += 0; else temp += 0 - 1; /* (2) */ if (y+1 == 0) temp += 0; else temp += (y + 1) - 1; /* (3) */ return temp; }
Вбудовування функцій дозволяє усунути витрати ресурсів, пов'язані з викликами функцій. Крім цього, після вбудовування можливо застосувати внутрішньопроцедурні оптимізації, які були неможливі або занадто важкі для реалізації до цього. Проте, у вбудовування є мінуси, як і майже у будь-який оптимізації — збільшується статичний розмір коду, що може призводити до негативних ефектів в частинах апаратури, чутливих до цього фактору.
Фактори, що впливають на оптимізацію
Серед факторів, що впливають на оптимізацію відзначаються як обчислювальні характеристики цільової машини (наприклад, кількість і тактова частота процесорних ядер, розмір процесорного кешу, пропускна здатність системної шини, обсяг оперативної пам'яті), так і архітектура цільового процесора (зокрема, в різних архітектурах є різне число регістрів загального призначення, по-різному реалізований обчислювальний конвеєр). Інший клас чинників, що впливають на оптимізацію — сценарії використання цільового програмного коду, наприклад, цільові характеристики оптимізації можуть значно відрізнятися для коду, призначеного налагодження і тестування, для запуску час від часу, для постійного використання, для застосування у вбудованих або автономних системах.
Загальні принципи
Серед принципів оптимізації, що застосовуються в різних методах оптимізації в компіляторах (деякі з них можуть суперечити один одному або бути непридатними при різних цілях оптимізації):
- зменшення надмірності: повторне використання результатів обчислень, скорочення числа переобчислень;
- компактифікація коду: видалення непотрібних обчислень і проміжних значень;
- скорочення числа переходів у коді: наприклад, використання [en] (англ. Inline expansion) або розмотування циклу дозволяє в багатьох випадках прискорити виконання програми ціною збільшення розміру коду;
- локальність: код і дані, доступ до яких необхідний найближчим часом, повинні бути розміщені поруч одне з одним у пам'яті, щоб дотримуватися [en];
- використання ієрархії пам'яті: розміщення найчастіше використовуваних даних у регістрах загального призначення, менш використовуваних — у кеші, ще менш використовуваних — в оперативній пам'яті, найрідше використовувані — на диску .
- розпаралелювання: змінення порядку операцій може дозволити виконати кілька обчислень паралельно, що прискорює виконання програми.
Конкретні методи
Оптимізація циклів
- [ru]
- Якщо змінна в циклі є результатом простої лінійної функції від індуктивної змінної, наприклад
for (i=0; i < 10; ++i) j = 17 * i;
, То можна відповідним чином оновлювати дану змінну на кожній ітерації. Це називається [en].
- Розподіл циклу на частини
- Робиться спроба розділити цикл на кілька окремих з тим самим діапазоном індексів. Кожен новий цикл є частиною тіла вихідного циклу. Це може поліпшити .
- [ru] (Злиття циклів)
- Інший метод, покликаний зменшити накладні витрати циклу. Якщо два сусідніх цикли повторюються однакове число разів, то їх тіла можуть бути об'єднані якщо, вони не взаємодіють.
- Інверсія циклу
- Цей метод змінює стандартний while цикл на цикл do / while, поставлений під деяку умову, що зменшує кількість переходів на два, для випадків, коли цикл виконується.
- Розщеплення циклу
- Робиться спроба спростити цикл або усунути залежності в циклі, розбивши його на кілька частин, що мають однакове тіло вихідного циклу і різні діапазони лічильника.
Оптимізація потоку даних
Оптимізація потоку даних заснована на [en] і зазвичай як вихідні дані розглядають пов'язані між собою граф потоку керування і граф потоку даних, а також часто дерево циклів і циклову розмітку графу потоку керування. Шляхом аналізу, зокрема пропагації інформації, на цих графах, виявляють можливість оптимізації з точки зору потрібних цілей, а потім оптимізації застосовуються.
- Усунення спільних підвиразів
- Видалення спільних підвиразів — оптимізація компілятора, за якої шукаються примірники однакових виразів і аналізується можливість заміни їх однією змінною, що містить обчислене значення.
- [ru]
- Оптимізація, за якої зменшуються надлишкові обчислення, шляхом заміни константних виразів і змінних їх значеннями.
- [en]
- Див. опис в оптимізації циклів .
- Видалення тупикових записів
- Видалення присвоєнь змінних, які згодом не читаються. Присвоєння видаляється або через те що до кінця часу життя змінної вона не була прочитана, або через те що подальше присвоєння її перезапише.
SSA-форма і оптимізації, засновані на ній
SSA (Single Static Assignment, єдине статичне присвоювання) — це форма подання графа потоку даних (DFG, Data Flow Graph), за якої кожній змінній значення присвоюється тільки один раз. Це дозволяє уникнути множення дуг у графі при багатьох записах і читаннях однієї змінної і полегшує аналіз графа. Для цього SSA-подання вводить спеціальні Phi-функції (вузли графа потоку даних) у деяких місцях сходження в графі потоку управління. Ці нові вузли є так званими псевдо-присвоюваннями.
Множинні визначення можливі не тільки через сходження потоку управління («або»), але через можливість читання деякого складеного значення, як цілого, яке було записано по частинах більш, ніж однією операцією («і»). В цьому випадку для підтримки SSA-форми вводяться додаткові псевдо-присвоювання всередині базових блоків, які збирають одне значення з кількох.
На SSA засновані деякі оптимізації. Хоча окремі з них можуть працювати і без SSA, найбільш ефективними вони є в присутності SSA.
Див. також
Примітки
- http://www.cs.uiuc.edu/class/fa07/cs498mjg/notes/optimizations.pdf[недоступне посилання] стор. 29-30: «Register allocation», «Instruction Scheduling»
- (PDF). Архів оригіналу (PDF) за 2 квітня 2005. Процитовано 25 березня 2007. стор. 8, про еквівалентність задачі створення повністю оптимізувального компілятора проблемі зупинки
- Cooper, Keith D.; Torczon, Linda (2004). Engineering a Compiler (англ.). Morgan Kaufmann. с. 407. ISBN .
Література
- Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е видання. — Москва: «Вильямс», 2008. — 1184 с. — 1500 прим. — .
- Steven Muchnick, Advanced Compiler Design and Implementation — Morgan Kaufmann, 1997 —
- Keith Cooper, Linda Torczon, Engineering a Compiler, Second Edition — Morgan Kaufmann, 2011 —
Посилання
- НОУ ІНТУЇТ | Введення в оптимізацію застосунків з використанням компіляторів Intel | Інформація / Інтуїт.ру, 2011
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Optimizuvalnij kompilyator kompilyator v yakomu vikoristovuyutsya rizni metodi otrimannya optimalnogo programnogo kodu pri zberezhenni jogo funkcionalnih mozhlivostej Najbilsh poshireni cili optimizaciyi skorochennya chasu vikonannya programi pidvishennya produktivnosti kompaktifikaciya programnogo kodu ekonomiya pam yati minimizaciya energovitrat zmenshennya kilkosti operacij vvedennya vivedennya Optimizaciya mozhe vidbuvatisya neyavno pid chas translyaciyi programi ale yak pravilo vvazhayetsya okremim etapom roboti kompilyatora Komponuvalniki takozh mozhut vikonuvati chastinu optimizacij takih yak viluchennya nevikoristovuvanih pidprogram abo yih Optimizaciya yak pravilo realizuyetsya za dopomogoyu poslidovnosti optimizuvalnih peretvoren algoritmiv yaki prijmayut programu i zminyuyut yiyi dlya otrimannya semantichno ekvivalentnogo variantu ale bilsh efektivnogo z tochki zoru deyakogo naboru cilej optimizaciyi Bulo pokazano sho deyaki problemi optimizaciyi kodu ye NP povnimi abo navit nerozv yaznimi Prote praktichno bagato z nih virishuyutsya nablizhenimi metodami sho dayut cilkom zadovilni rezultati Rozriznyayut nizko i visokorivnevu optimizaciyu Nizkorivneva optimizaciya peretvoryuye programu na rivni elementarnih komand napriklad instrukcij procesora konkretnoyi en Visokorivneva optimizaciya zdijsnyuyetsya na rivni strukturnih elementiv programi takih yak moduli funkciyi rozgaluzhennya cikli Tipi optimizacijMetodi vikoristovuvani dlya optimizaciyi mozhut buti klasifikovani za sferoyu zastosuvannya voni mozhut vplivati yak na okremij operator tak i na cilu programu Lokalni metodi zachipayut neveliku chastinu programi prostishe realizuvati nizh globalni zastosovuvani do vsiyeyi programi ale pri comu globalni metodi chasto viyavlyayutsya bilsh vigidnimi Peephole optimizaciya Lokalni peephole optimizaciyi angl peephole vichko rozglyadayut kilka susidnih v terminah odnogo z grafiv podannya programi instrukcij yak nibi divitsya u vichko na kod shob pobachiti chi mozhna yih yakos transformuvati z metoyu optimizaciyi Zokrema voni mozhut buti zamineni odniyeyu instrukciyeyu abo korotshoyu poslidovnistyu instrukcij Napriklad podvoyennya chisla mozhe buti bilsh efektivno vikonane z vikoristannyam livogo zsuvu abo shlyahom dodavannya chisla z takim samim Lokalna optimizaciya V lokalnij optimizaciyi za odin krok rozglyadayetsya tilki informaciya odnogo bazovogo bloku 404 lt ref gt Oskilki v bazovih blokah nemaye perehodiv potoku upravlinnya taka optimizaciya vimagaye neznachnogo analizu zaoshadzhuyuchi chas i znizhuyuchi vimogi do pam yati ale ce takozh oznachaye sho ne zberigayetsya informaciya dlya nastupnogo kroku Vnutrishnoprocedurna optimizaciya Vnutrishnoprocedurni optimizaciyi angl intraprocedural globalni optimizaciyi sho vikonuyutsya cilkom v ramkah odinici translyaciyi napriklad funkciyi abo proceduri 407 Za takoyi optimizaciyi opracovuyetsya znachno bilshe informaciyi nizh za lokalnoyi sho dozvolyaye dosyagati bilsh znachnogo efektu ale pri comu chasto potribni resursovitratni obchislennya Za nayavnosti u optimizovuvanij programnij odinici globalnih zminnih optimizaciya takogo vidu mozhe buti utrudnena Optimizaciya cikliv Isnuye znachna kilkist optimizacij sho zastosovuyutsya do cikliv Za velikoyi kilkosti povtoren ciklu taki optimizaciyi nadzvichajno efektivni oskilki nevelikim peretvorennyam vplivayut na znachnu chastinu vikonannya programi Oskilki cikli vagoma chastina chasu vikonannya bagatoh program optimizaciyi cikliv isnuyut praktichno u vsih kompilyatorah i ye najvazhlivishimi Napriklad viyavivshi ru inodi mozhna vinesti chastinu operacij z ciklu shob ne vikonuvati nadlishkovih povtornih obchislen Mizhprocedurna optimizaciya Taki vidi optimizacij analizuyut vidrazu ves sircevij kod programi Bilsha kilkist informaciyi sho otrimuyetsya danimi metodami oznachaye sho optimizaciyi mozhut buti bilsh efektivnimi v porivnyanni z inshimi metodami Taki optimizaciyi mozhut vikoristovuvati dosit skladni metodi napriklad viklik funkciyi zamishayetsya kopiyeyu tila funkciyi vbudovuvannya abo inline Priklad Nehaj ye deyaka funkciya int pred int x if x 0 return 0 else return x 1 Do yiyi vbudovuvannya kod viglyadav tak int f int y return pred y pred 0 pred y 1 Pislya optimizaciyi int f int y int temp 0 if y 0 temp 0 else temp y 1 1 if 0 0 temp 0 else temp 0 1 2 if y 1 0 temp 0 else temp y 1 1 3 return temp Vbudovuvannya funkcij dozvolyaye usunuti vitrati resursiv pov yazani z viklikami funkcij Krim cogo pislya vbudovuvannya mozhlivo zastosuvati vnutrishnoprocedurni optimizaciyi yaki buli nemozhlivi abo zanadto vazhki dlya realizaciyi do cogo Prote u vbudovuvannya ye minusi yak i majzhe u bud yakij optimizaciyi zbilshuyetsya statichnij rozmir kodu sho mozhe prizvoditi do negativnih efektiv v chastinah aparaturi chutlivih do cogo faktoru Faktori sho vplivayut na optimizaciyuSered faktoriv sho vplivayut na optimizaciyu vidznachayutsya yak obchislyuvalni harakteristiki cilovoyi mashini napriklad kilkist i taktova chastota procesornih yader rozmir procesornogo keshu propuskna zdatnist sistemnoyi shini obsyag operativnoyi pam yati tak i arhitektura cilovogo procesora zokrema v riznih arhitekturah ye rizne chislo registriv zagalnogo priznachennya po riznomu realizovanij obchislyuvalnij konveyer Inshij klas chinnikiv sho vplivayut na optimizaciyu scenariyi vikoristannya cilovogo programnogo kodu napriklad cilovi harakteristiki optimizaciyi mozhut znachno vidriznyatisya dlya kodu priznachenogo nalagodzhennya i testuvannya dlya zapusku chas vid chasu dlya postijnogo vikoristannya dlya zastosuvannya u vbudovanih abo avtonomnih sistemah Zagalni principiSered principiv optimizaciyi sho zastosovuyutsya v riznih metodah optimizaciyi v kompilyatorah deyaki z nih mozhut superechiti odin odnomu abo buti nepridatnimi pri riznih cilyah optimizaciyi zmenshennya nadmirnosti povtorne vikoristannya rezultativ obchislen skorochennya chisla pereobchislen kompaktifikaciya kodu vidalennya nepotribnih obchislen i promizhnih znachen skorochennya chisla perehodiv u kodi napriklad vikoristannya en angl Inline expansion abo rozmotuvannya ciklu dozvolyaye v bagatoh vipadkah priskoriti vikonannya programi cinoyu zbilshennya rozmiru kodu lokalnist kod i dani dostup do yakih neobhidnij najblizhchim chasom povinni buti rozmisheni poruch odne z odnim u pam yati shob dotrimuvatisya en vikoristannya iyerarhiyi pam yati rozmishennya najchastishe vikoristovuvanih danih u registrah zagalnogo priznachennya mensh vikoristovuvanih u keshi she mensh vikoristovuvanih v operativnij pam yati najridshe vikoristovuvani na disku rozparalelyuvannya zminennya poryadku operacij mozhe dozvoliti vikonati kilka obchislen paralelno sho priskoryuye vikonannya programi Konkretni metodiOptimizaciya cikliv ru Yaksho zminna v cikli ye rezultatom prostoyi linijnoyi funkciyi vid induktivnoyi zminnoyi napriklad for i 0 i lt 10 i j 17 i To mozhna vidpovidnim chinom onovlyuvati danu zminnu na kozhnij iteraciyi Ce nazivayetsya en Rozpodil ciklu na chastini Robitsya sproba rozdiliti cikl na kilka okremih z tim samim diapazonom indeksiv Kozhen novij cikl ye chastinoyu tila vihidnogo ciklu Ce mozhe polipshiti ru Zlittya cikliv Inshij metod poklikanij zmenshiti nakladni vitrati ciklu Yaksho dva susidnih cikli povtoryuyutsya odnakove chislo raziv to yih tila mozhut buti ob yednani yaksho voni ne vzayemodiyut Inversiya ciklu Cej metod zminyuye standartnij while cikl na cikl do while postavlenij pid deyaku umovu sho zmenshuye kilkist perehodiv na dva dlya vipadkiv koli cikl vikonuyetsya Rozsheplennya ciklu Robitsya sproba sprostiti cikl abo usunuti zalezhnosti v cikli rozbivshi jogo na kilka chastin sho mayut odnakove tilo vihidnogo ciklu i rizni diapazoni lichilnika Optimizaciya potoku danih Optimizaciya potoku danih zasnovana na en i zazvichaj yak vihidni dani rozglyadayut pov yazani mizh soboyu graf potoku keruvannya i graf potoku danih a takozh chasto derevo cikliv i ciklovu rozmitku grafu potoku keruvannya Shlyahom analizu zokrema propagaciyi informaciyi na cih grafah viyavlyayut mozhlivist optimizaciyi z tochki zoru potribnih cilej a potim optimizaciyi zastosovuyutsya Usunennya spilnih pidviraziv Vidalennya spilnih pidviraziv optimizaciya kompilyatora za yakoyi shukayutsya primirniki odnakovih viraziv i analizuyetsya mozhlivist zamini yih odniyeyu zminnoyu sho mistit obchislene znachennya ru Optimizaciya za yakoyi zmenshuyutsya nadlishkovi obchislennya shlyahom zamini konstantnih viraziv i zminnih yih znachennyami en Div opis v optimizaciyi cikliv Vidalennya tupikovih zapisiv Vidalennya prisvoyen zminnih yaki zgodom ne chitayutsya Prisvoyennya vidalyayetsya abo cherez te sho do kincya chasu zhittya zminnoyi vona ne bula prochitana abo cherez te sho podalshe prisvoyennya yiyi perezapishe SSA forma i optimizaciyi zasnovani na nij SSA Single Static Assignment yedine statichne prisvoyuvannya ce forma podannya grafa potoku danih DFG Data Flow Graph za yakoyi kozhnij zminnij znachennya prisvoyuyetsya tilki odin raz Ce dozvolyaye uniknuti mnozhennya dug u grafi pri bagatoh zapisah i chitannyah odniyeyi zminnoyi i polegshuye analiz grafa Dlya cogo SSA podannya vvodit specialni Phi funkciyi vuzli grafa potoku danih u deyakih miscyah shodzhennya v grafi potoku upravlinnya Ci novi vuzli ye tak zvanimi psevdo prisvoyuvannyami Mnozhinni viznachennya mozhlivi ne tilki cherez shodzhennya potoku upravlinnya abo ale cherez mozhlivist chitannya deyakogo skladenogo znachennya yak cilogo yake bulo zapisano po chastinah bilsh nizh odniyeyu operaciyeyu i V comu vipadku dlya pidtrimki SSA formi vvodyatsya dodatkovi psevdo prisvoyuvannya vseredini bazovih blokiv yaki zbirayut odne znachennya z kilkoh Na SSA zasnovani deyaki optimizaciyi Hocha okremi z nih mozhut pracyuvati i bez SSA najbilsh efektivnimi voni ye v prisutnosti SSA Div takozhEfektivnist algoritmuPrimitkihttp www cs uiuc edu class fa07 cs498mjg notes optimizations pdf nedostupne posilannya stor 29 30 Register allocation Instruction Scheduling PDF Arhiv originalu PDF za 2 kvitnya 2005 Procitovano 25 bereznya 2007 stor 8 pro ekvivalentnist zadachi stvorennya povnistyu optimizuvalnogo kompilyatora problemi zupinki Cooper Keith D Torczon Linda 2004 Engineering a Compiler angl Morgan Kaufmann s 407 ISBN 1 55860 699 8 LiteraturaAlfred Aho Monika Lam Ravi Seti Dzheffri Ulman Kompilyatory principy tehnologii i instrumentarij Compilers Principles Techniques and Tools 2 e vidannya Moskva Vilyams 2008 1184 s 1500 prim ISBN 978 5 8459 1349 4 Steven Muchnick Advanced Compiler Design and Implementation Morgan Kaufmann 1997 ISBN 1 55860 320 4 Keith Cooper Linda Torczon Engineering a Compiler Second Edition Morgan Kaufmann 2011 ISBN 978 0 12 088478 0PosilannyaNOU INTUYiT Vvedennya v optimizaciyu zastosunkiv z vikoristannyam kompilyatoriv Intel Informaciya Intuyit ru 2011