Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Principy překladačů Vysokoúrovňové optimalizace Jakub Yaghob
2
Optimalizace Ideální případ – generovaný kód je stejně dobrý jako ručně psaný Platí to dnes ještě? Skutečnost Pouze v několika vymezených situacích Obtížné Optimalizace Transformace programu Na rychlost nebo na velikost kódu Vysokoúrovňové optimalizace Prováděné nad mezikódem
3
Kritéria pro transformace Zachování smyslu programu Výstup a chování programu nesmí být transformací změněny Zrychlení o měřitelnou velikost Obvykle transformace zvyšující rychlost Někdy optimalizace zpomalí, i když v průměrném případě zrychluje Transformace musí být hodna vynaložené námaze Složitá/pomalá optimalizace s malým zrychlením není moc užitečná
4
Druhy optimalizací V rámci jednoho základního bloku Nejsou žádné skoky V rámci jedné funkce Pohyb kódu mezi bloky Vznikají, zanikají základní bloky V rámci celého programu (interprocedurální) Zrychlení volání mezi funkcemi Provádí se ve fázi linkování zpožděným překladem
5
Organizace optimalizátoru Analýza toku řízení Konstrukce grafu toku řízení Analýza toku dat Výpočet životnosti proměnných Optimalizátor kódu Front end Generátor kódu Analýza toku řízení Analýza toku dat Transformace
6
Lokální optimalizace V rámci jednoho základního bloku Eliminace společného podvýrazu (common subexpression elimination) Propagování kopií (copy propagation) Eliminace mrtvého kódu (dead-code elimination) x = y+z, a x již není nikde dál použitá Výpočet konstantních výrazů (constant folding) Algebraické transformace x = x + 0, x = x * 1
7
Lokální eliminace společného podvýrazu a = b + c b = a – d c = b + c d = a – d a = b + c b = a – d c = b + c d = b Je tady schovaný problém Pointer aliasing ap = &a b = a + c *ap = d e = a + c
8
Analýza toku dat „Obarvení“ uzlů grafu toku řízení (základních bloků) proměnnými, které jsou v tomto uzlu živé Nemusí být živé v celém základním bloku Uvnitř základního bloku se dopočítá přesná životnost Výpočet pořadí vyhodnocení Topologické setřídění DAGu, který popisuje definici proměnné jako cíl hran uzlů použitých pro výpočet Modelování ukazatelů Pointer aliasing Modelování volání funkcí Interprocedurální optimalizace
9
Globální optimalizace Více základních bloků, možný pohyb kódu mezi bloky, příp. i změna grafu toku řízení Eliminace společného podvýrazu (common subexpression elimination) Propagování kopií (copy propagation) Eliminace mrtvého kódu (dead-code elimination) Optimalizace cyklů Přesun invariantního kódu Redukce síly operace Odstranění indukční proměnné
10
Optimalizace cyklů – 1 while(i<limit-5) St = limit – 5; while(i<t) S Přesun invariantního kódu Výpočet, který se v cyklu nemění se předpočítá před cyklem
11
Optimalizace cyklů – 2 Redukce síly operace Typicky operace násobení převedená na sčítání Odstranění indukční proměnné Stačí pouze jediná indukční proměnná cyklu Obvykle se podaří zrušit při redukci for(i=3;i<8;i+=3) { j = i*2; a[j] = j; } for(t=6;t<16;t+=6) a[t] = t;
12
Příklad – kód v C i=m-1; j=n; v=a[n]; for(;;) { do ++i; while(a[i]<v); do --j; while(a[j]>v); if(i>=j) break; x=a[i]; a[i]=a[j]; a[j]=x; } x=a[i]; a[i]=a[n]; a[n]=x;
13
Příklad – tříadresový kód 1)i = m-1 2)j = n 3)t1 = 4*n 4)v = a[t1] 5)i = i+1 6)t2 = 4*i 7)t3 = a[t2] 8)if t3<v goto 5 9)j = j-1 10)t4 = 4*j 11)t5 = a[t4] 12)if t5>v goto 9 13)if i>=j goto 23 14)t6 = 4*i 15)x = a[t6] 16)t7 = 4*i 17)t8 = 4*j 18)t9 = a[t8] 19)a[t7] = t9 20)t10 = 4*j 21)a[t10] = x 22)goto 5 23)t11 = 4*i 24)x = a[t11] 25)t12 = 4*i 26)t13 = 4*n 27)t14 = a[t13] 28)a[t12] = t14 29)t15 = 4*n 30)a[t15] = x
14
Příklad – graf toku řízení i = m-1 j = n t1 = 4*n v = a[t1] i = i+1 t2 = 4*i t3 = a[t2] if t3<v goto B2 j = j-1 t4 = 4*j t5 = a[t4] if t5>v goto B3 if i>=j goto B6 t6 = 4*i x = a[t6] t7 = 4*i t8 = 4*j t9 = a[t8] a[t7] = t9 t10 = 4*j a[t10] = x goto B2 t11 = 4*i x = a[t11] t12 = 4*i t13 = 4*n t14 = a[t13] a[t12] = t14 t15 = 4*n a[t15] = x B1 B2 B3 B4 B5B6
15
Příklad - LCSE t6 = 4*i x = a[t6] t7 = 4*i t8 = 4*j t9 = a[t8] a[t7] = t9 t10 = 4*j a[t10] = x goto B2 B5 t6 = 4*i x = a[t6] t8 = 4*j t9 = a[t8] a[t6] = t9 a[t8] = x goto B2 B5
16
Příklad – GCSE i = m-1 j = n t1 = 4*n v = a[t1] i = i+1 t2 = 4*i t3 = a[t2] if t3<v goto B2 j = j-1 t4 = 4*j t5 = a[t4] if t5>v goto B3 if i>=j goto B6 x = t3 a[t2] = t5 a[t4] = x goto B2 x = t3 t14 = a[t1] a[t2] = t14 a[t1] = x B1 B4 B5B6 B2 B3
17
Příklad – copy propagation a dead-code elimination x = t3 a[t2] = t5 a[t4] = x goto B2 B5 x = t3 a[t2] = t5 a[t4] = t3 goto B2 B5 x = t3 a[t2] = t5 a[t4] = t3 goto B2 B5 a[t2] = t5 a[t4] = t3 goto B2 B5
18
Příklad – redukce síly operace i = m-1 j = n t1 = 4*n v = a[t1] B1 j = j-1 t4 = 4*j t5 = a[t4] if t5>v goto B3 B3 B2 if i>=j goto B6 B4 B5B6 i = m-1 j = n t1 = 4*n v = a[t1] t4 = 4*j B1 j = j-1 t4 = t4-4 t5 = a[t4] if t5>v goto B3 B3 B2 if i>=j goto B6 B4 B5B6
19
Příklad – odstranění indukční proměnné i = m-1 j = n t1 = 4*n v = a[t1] t4 = 4*j B1 j = j-1 t4 = t4-4 t5 = a[t4] if t5>v goto B3 B3 B2 if i>=j goto B6 B4 B5B6 i = m-1 j = n t1 = 4*n v = a[t1] t4 = 4*j B1 t4 = t4-4 t5 = a[t4] if t5>v goto B3 B3 B2 if i>=j goto B6 B4 B5B6
20
Příklad – výsledek i = m-1 j = n t1 = 4*n v = a[t1] t2 = 4*i t4 = 4*j t2 = t2+4 t3 = a[t2] if t3<v goto B2 t4 = t4-4 t5 = a[t4] if t5>v goto B3 if t2>=t4 goto B6 a[t2] = t5 a[t4] = t3 goto B2 t14 = a[t1] a[t2] = t14 a[t1] = t3 B1 B4 B5B6 B2 B3 Je to pěkný výsledek?
21
Příklad – pořádný výsledek i = m-1 t1 = 4*n v = a[t1] t2 = 4*i t4 = t1 t2 = t2+4 t3 = a[t2] if t3<v goto B2 t4 = t4-4 t5 = a[t4] if t5>v goto B3 if t2>=t4 goto B6 a[t2] = t5 a[t4] = t3 goto B2 t14 = a[t1] a[t2] = t14 a[t1] = t3 B1 B4 B5B6 B2 B3 Další aplikace lokálních optimalizací na B1
22
Paralelizace a vektorizace Paralelizace Implicitní x explicitní Části kódu, které lze vykonávat současně Přednačítání proměnných do cache Vektorizace Paralelizace výpočtu s použitím SIMD operací
23
Optimalizace řízená profilem (Profile Guided Optimization) Tři fáze Instrumentace Speciálně přeložený kód s voláním „sběrných“ funkcí na konci a začátku základních bloků Profilování Spouštění instrumentovaného programu s „typickými“ vstupy Sběr statistických dat o průchodu kódu „sběrnými“ funkcemi Optimalizace Nasbíraná statistická data ovlivní optimalizaci Využití při optimalizaci v mezikódu i kódu Změření váhy cest v grafu toku řízení Přidělování registrů
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.