Překladače 7. Optimalizace Obsah: typy optimalizací optimalizace toku dat, cyklů zřetězení, superskalarita víceprocesorové systémy CISC, RISC © Milan Keršláger http://www.pslib.cz/ke/slajdy 10. 4. 2013 http://creativecommons.org/licenses/by-nc-nd/3.0/
Optimalizace první část zadní části překladače závislá na cílové platformě vstup i výstup: typicky intermediální kód vhodnější forma pro optimalizace chyby optimalizace někdy je nutné optimalizaci vyloučit časově kritické operace (ovladač zřízení) aby zůstala záměrná forma kódu ladění pomocí debuggeru
Co je optimalizace modifikace programu (typicky strojová) beze změny funkce programu cílem vyšší efektivita, např: rychlost výpočtu rychlejší start méně systémových prostředků menší kód ...
Kdy se optimalizace provádí provádění při: při návrhu programu volba algoritmu úloha člověka (programátor) jako součást kompilace ručně (úprava algoritmu či jeho zápisu) automaticky (strojová úprava kódu) za běhu programu speciální JIT kompilátory (Just In Time) profilování (sledování a analýza běhu programu)
Rozsah optimalizace lokální v rámci bloku programu typicky malé lineární části kódu nemusí znát kontext programu globální v rámci podprogramů reorganizace kódu, zánik nepoužívaných částí, ... v rámci celého programu související kód blízko sebe
Typy optimalizací optimalizace toku dat způsob zpracování výrazů volba metody zpracování a vyhodnocení výrazu optimalizace cyklů reorganizace běhu programu hledání lepšího zápisu algoritmu optimalizace generování cílového kódu zaměření na použitou platformu, mikroprocesor závislé na hardware
Optimalizace toku dat 1 eliminace společných podvýrazů (a+b)*(a+b) zbytečný stejný výpočet výpočet konstantních podvýrazů (3+5)*x výpočet již při kompilaci analýza ukazatelů identifikace společných ukazatelů identifikace stejných dat
Optimalizace toku dat 2 sdružování úklidových operací hromadné rušení obsahu zásobníku např. mnohanásobné návraty z funkcí obsahuje lokální proměnné, parametry eliminace nepotřebných výrazů výpočet, který není dále použit odstraňování nedosažitelného kódu jak pro smyčky, tak pro podmínky
Optimalizace cyklů 1 slučování cyklů stejný rozsah řídící proměnné rozdělování cyklů optimalizace zpracování dat (cache) zaměňování cyklů vnitřní a vnější → lepší využití cache konstantní výrazy výraz má při průchodech stále stejnou hodnotu
Optimalizace cyklů 2 rozvinutí cyklu pro pevný počet opakování je kód duplikován ušetří se vyhodnocování, skoky (režie) unswitching vysunutí podmínky vně cyklu + duplikování cyklu indukční proměnné v každém cyklu se mění stejně (výpočet → součet) automatická paralelizace paralelizace nebo vektorizace výpočtu
Hardwarově závislé optimalizace cílená na platformu, procesor nejen CPU, ale i zbytek počítače (sběrnice, I/O) nutná detailní dokumentace zveřejňuje výrobce hardware Intel vlastní kompilátor, podílí se na optimalizacích SETI@Home, sponzorování vývoje GCC apod. nástroje pro simulace chování procesoru hardware zveřejňuje interní údaje využití cache (miss, hit, vylévání) měření počtu tiků hodin a podobně
Schéma procesoru Registry ALU Řadič paměti Prováděcí jednotka Řídící Dekodér instrukcí
Popis částí procesoru řídící jednotka organizace činnosti částí procesoru, hodiny dekodér instrukcí načítání a dekódování následující instrukce řadič paměti (+ cache) stránkování, segmentace → získání fyzické adresy ALU, prováděcí jednotka vlastní vykonávání instrukcí registry → uchovávání dat
Zřetězení (pipelining) jednotlivé části procesoru pracují postupně dle pokynů řídící jednotky postup provedení instrukce načtení, dekódování, provedení, uložení výsledku nečinné části lze zaměstnat po dekódování instrukce lze dekódovat další v jednom okamžiku různě rozpracované instrukce potíže se skokem (podmíněným) nutno zahodit rozpracované instrukce
Superskalarita zpracování více instrukcí najednou zvýšení výkonu procesoru (není ale více procesorů) CPU typově MIMD (Multiple Instruction, Multiple Data) výpočet je stále prováděn v jednom vlákně v jednom taktu může být dokončeno více strojových instrukcí některé vnitřní části CPU jsou duplikované aritmeticko-logická jednotka (ALU) celočíselná násobička, jednotka pro bitové posuny jednotka pro zpracování čísel s plovoucí čárkou (FPU) problém závislosti instrukce na výsledku předchozí problém atomicity → musí se emulovat
Víceprocesorové systémy více procesorů sdílí stejnou operační paměť procesor musí žádat o přístup do paměti (zápis) → procesor čeká na uvolnění přístupu stejný problém s datovými strukturami → souběh → zamykání NUMA každý procesor „svůj region paměti“ omezení vzájemné blokace žádost o přístup jen při přístupu do paměti jiného CPU
SMP symetrický multiprocesing → nejrozšířenější všechny procesory jsou si rovny datové struktury se důsledně zamykají při zamykání vzniká problém uváznutí (deadlock) problém návrhu jádra OS v době návrhu existovaly jen v PC jen UP (1 CPU) zamykáním (souběhem) se nikdo nezabýval pak to bylo potřeba do jádra „došít“ BIGLOCK (BKL) → jeden velký zámek nejjednodušší řešení, ale blokuje všechny ostatní CPU jeho odstranění: Windows 7 (skoro), Linux (plně 2011-5)
ASMP asymetrický multiprocesing máme více CPU, ale jádro OS jen pro UP řešení dovolíme jádru běžet jen na CPU#0 zavolá-li proces jádro z CPU#1, musí syscall čekat na přidělení prvního jádra procesoru (CPU#0) → problém zamykání řešíme serializací provádění kódu jádra → tím pádem nejsou potřeba zámky je to nejsnadnější přizpůsobení UP jádra pro (A)SMP ale spoustu času pročekáme na jádro CPU#0 příklad ASMP OS: Novell Netware 4.x byl to fileserver (sdílení disků v LAN), pomohlo to je možné, že některé činnosti jádra i na jiných CPU
Cache rychlá vyrovnávací paměť odděluje různě rychlé komponenty (CPU × RAM) ideálně obsahuje data, ke kterým se přistupuje zrychlení opakovaného přístupu naplnění širší sběrnicí (okolní obsah RAM) problém vhodné strategie umístění cache: na procesoru (L1) mezi procesorem a pamětí (L2, L3) v RAM (při čtení z disku)
Cache na procesoru typicky označována jako L1 instrukční cache snaha, aby se instrukce (ve smyčce) vešly do cache cache pro data strategické rozmístění dat v RAM analýza využití cache simulátor procesoru (poskytuje výrobce) statistická data od procesoru za běhu procesoru
Cache pro RAM nastavení v setupu BIOSu BIOS při startu nastavuje chipset dvě možnosti: writeback → zápis do RAM až později vznik nekonzistencí, nucený zápis při vylití cache při zápisu cache okamžitě data přijme minimalizace doby trvání zápisu z CPU do RAM pass-through → zachycení dat při zápisu procesor čeká, až se data zapíší do RAM během zápisu cache procházející data zachytí
Zarovnání paměti RAM připojena k CPU sběrnicí FSB tzv. Front-side bus v současnosti typicky 64 bitů (Intel, AMD) paměť na stejné frekvenci, jako FSB procesor běží rychleji (podle zvoleného násobku) RAM do matice podle šířky FSB čtení sousedních bajtů musí být někdy nadvakrát data umisťována tak, aby stačilo jedno čtení tj. při ukládání dat se nevyplatí „šetřit“
CISC vs. RISC RISC → ARM, MIPS, SPARC, ... redukovaná instrukční sada jednoduché, stejně dlouhé instrukce, provedení v 1 taktu jednodušší konstrukce procesoru jednodušší logika, lze větší cache, menší spotřeba, ... CISC → Intel x86 a kompatibilní rozšířená instrukční sada specializované instrukce (násobení) komplikuje návrh procesoru dnes již nemá význam (používáme překladače)
Endianita způsob ukládání větších čísel (pořadí bajtů) big endian Motorola 68000, SPARC pomůcka: „big end first“ číslo 0x1234 v paměti postupně po bajtech: 12, 34 little endian Intel, DEC VAX pomůcka: „little end first“ číslo 0x1234 v paměti postupně po bajtech: 34, 12 problém při komunikaci mezi systémy musí být určen např. zápis portu, IP adresy, ...
Koprocesor doplňující procesor v počítači (coprocesor) pro operace v plovoucí řádové čárce → FPU Floating Point Unit (od 80486 součást CPU) pro grafiku → GPU Graphical Processor Unit tzv. offloading (delegování výpočtu na GPU) šifrovací procesory rychlé provádění transformací dat signálové procesory Digital Signal Processing (DSP) Analog signal processing (filtry, mixér, zpoždění...) Discrete signal processing
Optimalizace cílového kódu 1 alokace registrů rozhodnutí, jaké proměnné a kdy v registrech registrů je málo používají se grafy, barvení grafů výběr instrukcí lepší varianta (varianty u CISC, rozšíření MMX...) využití koprocesoru maximalizace využití zřetězení překrývání zpracování strojových instrukcí vhodné přerovnání instrukcí beze změny smyslu
Optimalizace cílového kódu 2 maximalizace využití superskalarity paralelní zpracování strojových instrukcí opět vhodné přerovnání instrukcí optimalizace cache v CPU jak pro data, tak pro instrukce rozložení kódu v binárním souboru (cache v RAM) zarovnání paměti eliminace dvojího čtení z paměti