Specializace algoritmu běhu - Run-time algorithm specialisation

Ve vědě o počítačích , run-time algoritmus specializace je metodika pro vytváření efektivních algoritmů pro nákladné výpočetní úlohy některých druhů. Metodika má původ v oblasti automatizovaného dokazování teorémů a konkrétněji v projektu proverování teorémů upírů .

Tato myšlenka je inspirována využitím částečného vyhodnocení při optimalizaci překladu programu. Mnoho základních operací v testovacích větách vykazuje následující vzorec. Předpokládejme, že musíme provést nějaký algoritmus v situaci, kdy je hodnota fixována pro potenciálně mnoho různých hodnot . Abychom to mohli udělat efektivně, můžeme se pokusit najít specializaci pro každý fixní , tj. Takový algoritmus , že spuštění je ekvivalentní provedení .

Specializovaný algoritmus může být efektivnější než obecný, protože může využívat některé konkrétní vlastnosti pevné hodnoty . Obvykle se může vyhnout některým operacím, které by musely provést, pokud je známo, že jsou pro tento konkrétní parametr nadbytečné . Zejména můžeme často identifikovat některé testy, které jsou pravdivé nebo nepravdivé , odvíjení smyček a rekurze atd.

Rozdíl od částečného hodnocení

Klíčovým rozdílem mezi specializací za běhu a částečným hodnocením je to, že hodnoty, na které se specializuje, nejsou staticky známy, takže specializace probíhá za běhu .

Existuje také důležitý technický rozdíl. Částečné vyhodnocení se aplikuje na algoritmy výslovně reprezentované jako kódy v některém programovacím jazyce. Za běhu nepotřebujeme žádné konkrétní zastoupení . Musíme si jen představit, když programujeme postup specializace. Vše, co potřebujeme, je konkrétní zastoupení specializované verze . To také znamená, že nemůžeme použít žádné univerzální metody pro specializaci algoritmů, což je obvykle případ částečného vyhodnocení. Místo toho musíme naprogramovat specializační postup pro každý konkrétní algoritmus . Důležitou výhodou je, že můžeme použít několik výkonných triků ad hoc využívajících zvláštnosti a reprezentaci a , které jsou mimo dosah jakýchkoli univerzálních metod specializace.

Specializace na kompilaci

Specializovaný algoritmus musí být reprezentován ve formě, která může být interpretována. V mnoha situacích, obvykle když se má počítat na mnoha hodnotách za sebou, můžeme psát jako kód speciálního abstraktního stroje a často říkáme, že je kompilován . Samotný kód pak lze dodatečně optimalizovat transformacemi zachovávajícími odpovědi, které se spoléhají pouze na sémantiku pokynů abstraktního stroje.

Pokyny abstraktního stroje lze obvykle představovat jako záznamy. Jedno pole takového záznamu ukládá celočíselnou značku, která identifikuje typ instrukce, další pole lze použít pro ukládání dalších parametrů instrukce, například ukazatel na jinou instrukci představující návěští, pokud sémantika instrukce vyžaduje skok. Všechny pokyny kódu lze uložit do pole, seznamu nebo stromu.

Interpretace se provádí načtením pokynů v určitém pořadí, identifikací jejich typu a provedením akcí spojených s tímto typem. V C nebo C ++ můžeme použít příkaz switch k přidružení některých akcí k různým značkám instrukcí. Moderní kompilátoři obvykle kompilují příkaz switch s celočíselnými popisky z úzkého rozsahu poměrně efektivně tím, že ukládají adresu příkazu odpovídající hodnotě v -té buňce speciálního pole. Lze to zneužít tak, že hodnoty pro instrukční značky přebíráme z malého intervalu celých čísel.

Specializace na data a algoritmy

Existují situace, kdy je mnoho instancí určeno k dlouhodobému ukládání a volání se vyskytují u různých v nepředvídatelném pořadí. Například může musíme zkontrolovat jako první, pak , pak , a tak dále. Za takových okolností nemusí být úplná specializace s kompilací vhodná kvůli nadměrnému využití paměti. Někdy však můžeme najít kompaktní specializované zastoupení pro všechny , které lze uložit s nebo místo . Rovněž definujeme variantu, která funguje na této reprezentaci, a každé volání na je nahrazeno znakem , který je určen k rychlejšímu provedení stejné úlohy.

Viz také

Reference

Další čtení