У теорії компіляторів оптимізація циклів — це процес збільшення швидкості виконання та зменшення витрат, пов'язаних із циклами.
Оптимізація циклів посідає важливе місце в покращенні швидкодії кешу через ефективне використання можливостей паралельної обробки та зменшення витрат, пов'язаних із виконанням циклів. Більшість часу виконання наукових (та й великої кількості користувацьких) програм припадає на цикли, тому розроблено багато технік для пришвидшення виконання циклів.
Представлення обчислень і перетворень
Оскільки інструкції всередині циклів можуть виконуватися багаторазово, часто неможливо встановити межу кількості виконання інструкцій, на які вплине оптимізація циклу. Це створює проблеми під час оцінювання правильності й переваг оптимізації циклів, зокрема подання оптимізованого обчислення та виконуваної оптимізації.
Оптимізація за допомогою послідовності перетворень циклів
Оптимізацію циклів можна розглядати як застосування послідовності певних перетворень циклів (перерахованих нижче або в документі Перетворення компілятора для високопродуктивних обчислень) до сирцевого коду або [en], при цьому кожне перетворення має відповідний тест валідності. Перетворення (або послідовність перетворень) загалом має зберігати часову послідовність усіх залежностей, щоб не змінити результату роботи програми (тобто бути валідним перетворенням). В рамках цього підходу оцінити переваги перетворення або послідовності перетворень буває досить складно, оскільки застосування одного корисного перетворення може вимагати попереднього застосування одного або кількох інших перетворень, які самі по собі призводять до зниження продуктивності.
До поширених перетворень циклів належать:
- [en] або розбиття — спроба розбити цикл на кілька циклів на одному діапазоні індексів, але щоб кожен з нових циклів містив лише частину (тіла) початкового циклу. Це може покращити [en], як на дані, які доступні в циклі, так і на код у тілі циклу.
- [en] або об'єднання — полягає в об'єднанні тіл двох сусідніх циклів, які повторюються однакову кількість разів (незалежно від того, чи відоме це число під час компіляції), якщо вони не посилаються на дані один одного.
- [en] або перестановка — обмін місцями внутрішнього та зовнішнього циклів. Коли змінні циклу індексують масив, таке перетворення може покращити локальність посилань, залежно від структури масиву.
- — метод, за якого (цикл з передумовою) замінюють (циклом з післяумовою), вкладений в умовний оператор, зменшуючи кількість переходів на два для випадків, коли цикл виконується. При цьому дублюється перевірка умови (зростає обсяг коду), але зростає ефективність, оскільки стрибки зазвичай викликають [en]. Крім того, якщо початкова умова відома під час компіляції, і відомо, що немає побічних ефектів, початкову перевірку умови можна опустити.
- [en] — можна значно підвищити ефективність, прибравши з тіла циклу і розмістивши перед циклом обчислення величин, однакових для кожної ітерації циклу (тобто інваріантів циклу). Це особливо важливо для виразів для обчислення адреси, використовуваних у циклах за масивами. Для правильної реалізації цей прийом слід використовувати з інверсією, оскільки не весь код безпечно переміщати за межі циклу.
- [en] — це окремий випадок автоматичного розпаралелювання, що фокусується на циклах, змінюючи їх для ефективної роботи в багатопроцесорних системах. Це можна зробити автоматично компіляторами (автоматичне розпаралелювання) або вручну (вставляючи директиви розпаралелювання, такі як OpenMP).
- Розворот — тонка оптимізація, яка змінює порядок, у якому значення присвоюються змінній індексу. Це може допомогти усунути [en] і таким чином уможливити інші оптимізації. Деякі архітектури використовують циклічні конструкції на рівні збірки, в яких відлік ведеться лише в одному напрямку (наприклад, decrement-jump-if-not-zero [DJNZ]).
- [en] — це поділ циклу на кілька частин, які можуть виконуватися одночасно на кількох процесорах.
- [en] — ця техніка застосовується до вкладеного циклу, що виконує ітерацію за багатовимірним масивом, де кожна ітерація (внутрішнього циклу) залежить від попередніх ітерацій, і змінює порядок доступу до масиву так, щоб залежності були лише між ітераціями зовнішнього циклу.
- [en] — тип позачергового виконання ітерацій циклу, щоб приховати затримки функціональних блоків процесора.
- Розщеплення або злущення — це спроба спростити цикл або усунути залежності, розбивши його на кілька циклів, які мають однакові тіла, але перебирають різні частини діапазону індексів. Окремий випадок — це злущення циклу, яке дозволяє спростити цикл із проблемною першою ітерацією, виконавши цю ітерацію окремо перед входом у цикл.
- [en] — реорганізує цикл для опрацювання блоків даних, які поміщаються в кеш.
- [en] — спроба одночасно запустити якомога більше ітерацій циклу в системі SIMD.
- Розмотування — дублює тіло циклу кілька разів, щоб зменшити кількість перевірок умови циклу та кількість стрибків, які можуть знизити продуктивність через погіршення роботи конвеєра інструкцій. Повне розмотування циклу усуває всі накладні витрати (крім вибірки кількох інструкцій і збільшення часу завантаження програми), але вимагає, щоб кількість ітерацій була відомою під час компіляції (крім випадку JIT-компіляції). Необхідно також подбати про те, щоб багаторазовий перерахунок індексованих змінних не вимагав більших витрат, ніж просування покажчиків у початковому циклі.
- [en] — переміщує умовний оператор з тіла циклу назовні, копіюючи тіло циклу та розміщуючи його версію в кожній з гілок якщо та інакше.
- [en] або стрип-майнінг — запроваджене для векторних процесорів, секціювання циклу є технікою його перетворення для уможливлення SIMD-кодування циклів і підвищення продуктивності пам'яті. Це забезпечує, що кожна векторна операція виконується над вектором, розмір якого менший або рівний найбільшій довжині вектора даної векторної машини.
Схема унімодулярного перетворення
Унімодулярне перетворення використовує одну унімодулярну матрицю для опису комбінованого результату послідовності багатьох з перелічених вище перетворень. Центральним у цьому підході є погляд на множину всіх виконань оператора в межах n циклів як на набір цілих точок у n-вимірному просторі, причому точки виконуються в лексикографічному порядку. Наприклад, виконання оператора, вкладеного в зовнішній цикл з індексом i та внутрішній цикл з індексом j, можна пов'язати з парами цілих чисел . Застосування унімодулярного перетворення відповідає множенню точок у цьому просторі на матрицю. Наприклад, заміна двох циклів відповідає матриці .
Унімодулярне перетворення є валідним, якщо воно зберігає часову послідовність усіх залежностей; виміряти вплив унімодулярного перетворення на продуктивність складніше. Неідеально вкладені цикли та деякі перетворення (наприклад, гніздове) нелегко вписуються в цю структуру.
Багатогранна схема або схема на основі обмежень
[en] опрацьовує ширший клас програм і перетворень, ніж унімодулярна схема. Множина виконань набору операторів у межах, можливо, неідеально вкладеного набору циклів, розглядається як об'єднання набору політопів, які подають виконання операторів. До цих політопів застосовують афінні перетворення, які дають опис нового порядку виконання. Межі політопів, залежності даних і перетворення часто описуютья за допомогою систем обмежень, і цей підхід часто називають підходом до оптимізації циклів на основі обмежень. Наприклад, один оператор у зовнішньому циклі 'for i := 0 to n ' і внутрішньому циклі 'for j := 0 to i+2 ' виконується один раз для кожної пари (i, j) так, що 0 <= i <= n і 0 <= j <= i+2.
Знову ж таки, перетворення є валідним, якщо воно зберігає часову послідовність усіх залежностей. Оцінка переваг перетворення або пошук найкращого перетворення для даного коду на даному комп'ютері залишаються предметом поточних досліджень на момент написання цієї статті (2010).
Див. також
Примітки
- У книзі Reasoning About Program Transformations, Жан-Франсуа Коллар докладно обговорює загальні питання подання виконання програм, а не тексту програми в контексті статичної оптимізації.
- David F. Bacon, , and Oliver J. Sharp. Compiler transformations for high-performance computing. Report No. UCB/CSD 93/781, Computer Science Division-EECS, University of California, Berkeley, Berkeley, California 94720, November 1993 (доступна на CiteSeer). Наведено аналіз компілятора, такий як аналіз залежності даних і міжпроцедурний аналіз, а також дуже повний список перетворень циклів.
- 8051 Instruction Set. www.win.tue.nl. Процитовано 9 грудня 2019.
- Intel Developer Zone.
- 7.6.3.1 Strip-Mining (Sun Studio 12: Fortran Programming Guide).
- Steven S. Muchnick, Advanced Compiler Design and Implementation, 1997 Morgan Kaufmann. В розділі 20.4.2 обговорюється оптимізація циклів.
- R. Allen and K. Kennedy. Optimizing Compilers for Modern Architectures. Morgan Kaufmann, 2002.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U teoriyi kompilyatoriv optimizaciya cikliv ce proces zbilshennya shvidkosti vikonannya ta zmenshennya vitrat pov yazanih iz ciklami Optimizaciya cikliv posidaye vazhlive misce v pokrashenni shvidkodiyi keshu cherez efektivne vikoristannya mozhlivostej paralelnoyi obrobki ta zmenshennya vitrat pov yazanih iz vikonannyam cikliv Bilshist chasu vikonannya naukovih ta j velikoyi kilkosti koristuvackih program pripadaye na cikli tomu rozrobleno bagato tehnik dlya prishvidshennya vikonannya cikliv Predstavlennya obchislen i peretvorenOskilki instrukciyi vseredini cikliv mozhut vikonuvatisya bagatorazovo chasto nemozhlivo vstanoviti mezhu kilkosti vikonannya instrukcij na yaki vpline optimizaciya ciklu Ce stvoryuye problemi pid chas ocinyuvannya pravilnosti j perevag optimizaciyi cikliv zokrema podannya optimizovanogo obchislennya ta vikonuvanoyi optimizaciyi Optimizaciya za dopomogoyu poslidovnosti peretvoren ciklivOptimizaciyu cikliv mozhna rozglyadati yak zastosuvannya poslidovnosti pevnih peretvoren cikliv pererahovanih nizhche abo v dokumenti Peretvorennya kompilyatora dlya visokoproduktivnih obchislen do sircevogo kodu abo en pri comu kozhne peretvorennya maye vidpovidnij test validnosti Peretvorennya abo poslidovnist peretvoren zagalom maye zberigati chasovu poslidovnist usih zalezhnostej shob ne zminiti rezultatu roboti programi tobto buti validnim peretvorennyam V ramkah cogo pidhodu ociniti perevagi peretvorennya abo poslidovnosti peretvoren buvaye dosit skladno oskilki zastosuvannya odnogo korisnogo peretvorennya mozhe vimagati poperednogo zastosuvannya odnogo abo kilkoh inshih peretvoren yaki sami po sobi prizvodyat do znizhennya produktivnosti Do poshirenih peretvoren cikliv nalezhat en abo rozbittya sproba rozbiti cikl na kilka cikliv na odnomu diapazoni indeksiv ale shob kozhen z novih cikliv mistiv lishe chastinu tila pochatkovogo ciklu Ce mozhe pokrashiti en yak na dani yaki dostupni v cikli tak i na kod u tili ciklu en abo ob yednannya polyagaye v ob yednanni til dvoh susidnih cikliv yaki povtoryuyutsya odnakovu kilkist raziv nezalezhno vid togo chi vidome ce chislo pid chas kompilyaciyi yaksho voni ne posilayutsya na dani odin odnogo en abo perestanovka obmin miscyami vnutrishnogo ta zovnishnogo cikliv Koli zminni ciklu indeksuyut masiv take peretvorennya mozhe pokrashiti lokalnist posilan zalezhno vid strukturi masivu metod za yakogo cikl z peredumovoyu zaminyuyut ciklom z pislyaumovoyu vkladenij v umovnij operator zmenshuyuchi kilkist perehodiv na dva dlya vipadkiv koli cikl vikonuyetsya Pri comu dublyuyetsya perevirka umovi zrostaye obsyag kodu ale zrostaye efektivnist oskilki stribki zazvichaj viklikayut en Krim togo yaksho pochatkova umova vidoma pid chas kompilyaciyi i vidomo sho nemaye pobichnih efektiv pochatkovu perevirku umovi mozhna opustiti en mozhna znachno pidvishiti efektivnist pribravshi z tila ciklu i rozmistivshi pered ciklom obchislennya velichin odnakovih dlya kozhnoyi iteraciyi ciklu tobto invariantiv ciklu Ce osoblivo vazhlivo dlya viraziv dlya obchislennya adresi vikoristovuvanih u ciklah za masivami Dlya pravilnoyi realizaciyi cej prijom slid vikoristovuvati z inversiyeyu oskilki ne ves kod bezpechno peremishati za mezhi ciklu en ce okremij vipadok avtomatichnogo rozparalelyuvannya sho fokusuyetsya na ciklah zminyuyuchi yih dlya efektivnoyi roboti v bagatoprocesornih sistemah Ce mozhna zrobiti avtomatichno kompilyatorami avtomatichne rozparalelyuvannya abo vruchnu vstavlyayuchi direktivi rozparalelyuvannya taki yak OpenMP Rozvorot tonka optimizaciya yaka zminyuye poryadok u yakomu znachennya prisvoyuyutsya zminnij indeksu Ce mozhe dopomogti usunuti en i takim chinom umozhliviti inshi optimizaciyi Deyaki arhitekturi vikoristovuyut ciklichni konstrukciyi na rivni zbirki v yakih vidlik vedetsya lishe v odnomu napryamku napriklad decrement jump if not zero DJNZ en ce podil ciklu na kilka chastin yaki mozhut vikonuvatisya odnochasno na kilkoh procesorah en cya tehnika zastosovuyetsya do vkladenogo ciklu sho vikonuye iteraciyu za bagatovimirnim masivom de kozhna iteraciya vnutrishnogo ciklu zalezhit vid poperednih iteracij i zminyuye poryadok dostupu do masivu tak shob zalezhnosti buli lishe mizh iteraciyami zovnishnogo ciklu en tip pozachergovogo vikonannya iteracij ciklu shob prihovati zatrimki funkcionalnih blokiv procesora Rozsheplennya abo zlushennya ce sproba sprostiti cikl abo usunuti zalezhnosti rozbivshi jogo na kilka cikliv yaki mayut odnakovi tila ale perebirayut rizni chastini diapazonu indeksiv Okremij vipadok ce zlushennya ciklu yake dozvolyaye sprostiti cikl iz problemnoyu pershoyu iteraciyeyu vikonavshi cyu iteraciyu okremo pered vhodom u cikl en reorganizuye cikl dlya opracyuvannya blokiv danih yaki pomishayutsya v kesh en sproba odnochasno zapustiti yakomoga bilshe iteracij ciklu v sistemi SIMD Rozmotuvannya dublyuye tilo ciklu kilka raziv shob zmenshiti kilkist perevirok umovi ciklu ta kilkist stribkiv yaki mozhut zniziti produktivnist cherez pogirshennya roboti konveyera instrukcij Povne rozmotuvannya ciklu usuvaye vsi nakladni vitrati krim vibirki kilkoh instrukcij i zbilshennya chasu zavantazhennya programi ale vimagaye shob kilkist iteracij bula vidomoyu pid chas kompilyaciyi krim vipadku JIT kompilyaciyi Neobhidno takozh podbati pro te shob bagatorazovij pererahunok indeksovanih zminnih ne vimagav bilshih vitrat nizh prosuvannya pokazhchikiv u pochatkovomu cikli en peremishuye umovnij operator z tila ciklu nazovni kopiyuyuchi tilo ciklu ta rozmishuyuchi jogo versiyu v kozhnij z gilok yaksho ta inakshe en abo strip majning zaprovadzhene dlya vektornih procesoriv sekciyuvannya ciklu ye tehnikoyu jogo peretvorennya dlya umozhlivlennya SIMD koduvannya cikliv i pidvishennya produktivnosti pam yati Ce zabezpechuye sho kozhna vektorna operaciya vikonuyetsya nad vektorom rozmir yakogo menshij abo rivnij najbilshij dovzhini vektora danoyi vektornoyi mashini Shema unimodulyarnogo peretvorennya Unimodulyarne peretvorennya vikoristovuye odnu unimodulyarnu matricyu dlya opisu kombinovanogo rezultatu poslidovnosti bagatoh z perelichenih vishe peretvoren Centralnim u comu pidhodi ye poglyad na mnozhinu vsih vikonan operatora v mezhah n cikliv yak na nabir cilih tochok u n vimirnomu prostori prichomu tochki vikonuyutsya v leksikografichnomu poryadku Napriklad vikonannya operatora vkladenogo v zovnishnij cikl z indeksom i ta vnutrishnij cikl z indeksom j mozhna pov yazati z parami cilih chisel i j displaystyle i j Zastosuvannya unimodulyarnogo peretvorennya vidpovidaye mnozhennyu tochok u comu prostori na matricyu Napriklad zamina dvoh cikliv vidpovidaye matrici 0 1 1 0 displaystyle begin bmatrix 0 amp 1 1 amp 0 end bmatrix Unimodulyarne peretvorennya ye validnim yaksho vono zberigaye chasovu poslidovnist usih zalezhnostej vimiryati vpliv unimodulyarnogo peretvorennya na produktivnist skladnishe Neidealno vkladeni cikli ta deyaki peretvorennya napriklad gnizdove nelegko vpisuyutsya v cyu strukturu Bagatogranna shema abo shema na osnovi obmezhen en opracovuye shirshij klas program i peretvoren nizh unimodulyarna shema Mnozhina vikonan naboru operatoriv u mezhah mozhlivo neidealno vkladenogo naboru cikliv rozglyadayetsya yak ob yednannya naboru politopiv yaki podayut vikonannya operatoriv Do cih politopiv zastosovuyut afinni peretvorennya yaki dayut opis novogo poryadku vikonannya Mezhi politopiv zalezhnosti danih i peretvorennya chasto opisuyutya za dopomogoyu sistem obmezhen i cej pidhid chasto nazivayut pidhodom do optimizaciyi cikliv na osnovi obmezhen Napriklad odin operator u zovnishnomu cikli for i 0 to n i vnutrishnomu cikli for j 0 to i 2 vikonuyetsya odin raz dlya kozhnoyi pari i j tak sho 0 lt i lt n i 0 lt j lt i 2 Znovu zh taki peretvorennya ye validnim yaksho vono zberigaye chasovu poslidovnist usih zalezhnostej Ocinka perevag peretvorennya abo poshuk najkrashogo peretvorennya dlya danogo kodu na danomu komp yuteri zalishayutsya predmetom potochnih doslidzhen na moment napisannya ciyeyi statti 2010 Div takozhMasshtabovanij paralelizmPrimitkiU knizi Reasoning About Program Transformations Zhan Fransua Kollar dokladno obgovoryuye zagalni pitannya podannya vikonannya program a ne tekstu programi v konteksti statichnoyi optimizaciyi David F Bacon and Oliver J Sharp Compiler transformations for high performance computing Report No UCB CSD 93 781 Computer Science Division EECS University of California Berkeley Berkeley California 94720 November 1993 dostupna na CiteSeer Navedeno analiz kompilyatora takij yak analiz zalezhnosti danih i mizhprocedurnij analiz a takozh duzhe povnij spisok peretvoren cikliv 8051 Instruction Set www win tue nl Procitovano 9 grudnya 2019 Intel Developer Zone 7 6 3 1 Strip Mining Sun Studio 12 Fortran Programming Guide Steven S Muchnick Advanced Compiler Design and Implementation 1997 Morgan Kaufmann V rozdili 20 4 2 obgovoryuyetsya optimizaciya cikliv R Allen and K Kennedy Optimizing Compilers for Modern Architectures Morgan Kaufmann 2002