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.
Obsah
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é
- Psyco , specializovaný run-time kompilátor pro Python
- vícestupňové programování
Reference
- A. Voronkov, „The Anatomy of Vampire: Implementing Bottom-Up Procedures with Code Trees“, Journal of Automated Reasoning , 15 (2), 1995 ( původní myšlenka )
Další čtení
- A. Riazanov a A. Voronkov, „Efektivní kontrola omezení termínových objednávek“, Proc. IJCAR 2004, Lecture Notes in Artificial Intelligence 3097, 2004 ( kompaktní, ale samostatná ilustrace metody )
- A. Riazanov a A. Voronkov, Efficient Instance Retrieval with Standard and Relational Path Indexing , Information and Computation, 199 (1-2), 2005 ( obsahuje další ilustraci metody )
- A. Riazanov, „Implementing an Efficient Theorem Prover“ , disertační práce, University of Manchester, 2003 ( obsahuje nejucelenější popis metody a mnoho příkladů )