Specjalizacja algorytmu czasu wykonywania
W informatyce specjalizacja algorytmów czasu wykonywania to metodologia tworzenia wydajnych algorytmów dla kosztownych zadań obliczeniowych pewnego rodzaju. Metodologia wywodzi się z dziedziny automatycznego dowodzenia twierdzeń , a dokładniej z projektu dowodzenia twierdzeń o wampirach .
Pomysł jest inspirowany wykorzystaniem częściowej oceny w optymalizacji tłumaczenia programów. Wiele podstawowych operacji w dowodach twierdzeń ma następujący wzór. wykonać jakiś algorytm , dla różne wartości . Aby zrobić to skutecznie, możemy spróbować znaleźć Displaystyle \ mathit jest równoznaczne z wykonaniem .
Algorytm wyspecjalizowany może być bardziej wydajny niż algorytm ogólny, ponieważ może wykorzystywać pewne szczególne właściwości stałej wartości . Zazwyczaj można uniknąć niektórych operacji, które musiałyby działać, jeśli wiadomo, że są zbędne dla tego konkretnego parametru . W szczególności często możemy zidentyfikować niektóre testy, które są prawdziwe lub fałszywe dla rozwijania pętli i rekurencji itp.
Różnica w stosunku do oceny częściowej
polega na tym, że wartości, na których specjalizuje nie są znane statycznie, więc specjalizacja ma miejsce za w czasie wykonywania .
Istnieje również istotna różnica techniczna. Częściowa ocena jest stosowana do algorytmów jawnie reprezentowanych jako kody w niektórych językach programowania. W czasie wykonywania nie potrzebujemy żadnej konkretnej reprezentacji za \ Musimy tylko sobie programujemy procedurę specjalizacji Wszystko, czego potrzebujemy, to konkretna reprezentacja specjalistycznej wersji . Oznacza to również, że nie możemy stosować żadnych uniwersalnych metod specjalizacji algorytmów, jak to zwykle ma miejsce w przypadku oceny cząstkowej. Zamiast tego musimy zaprogramować procedurę specjalizacji dla każdego konkretnego algorytmu . Ważną zaletą takiego postępowania jest to, że możemy użyć kilku potężnych ad hoc wykorzystujących osobliwości reprezentację i , które są poza zasięgiem jakichkolwiek uniwersalnych metod specjalizacyjnych.
Specjalizacja z kompilacją
Wyspecjalizowany algorytm musi być przedstawiony w postaci, która może być interpretowana. , zwykle gdy wielu wartościach rzędu zapisz specjalnej maszyny abstrakcyjnej i często mówimy, że kompilowany ZA . Wtedy sam kod można dodatkowo zoptymalizować poprzez transformacje zachowujące odpowiedzi, które opierają się wyłącznie na semantyce instrukcji maszyny abstrakcyjnej.
Instrukcje maszyny abstrakcyjnej można zwykle przedstawić jako rekordy. Jedno pole takiego rekordu zawiera znacznik typu integer, który identyfikuje typ instrukcji, inne pola mogą służyć do przechowywania dodatkowych parametrów instrukcji, np. wskaźnika do innej instrukcji reprezentującej etykietę, jeśli semantyka instrukcji wymaga skoku. Wszystkie instrukcje kodu mogą być przechowywane w tablicy, liście lub drzewie.
Interpretacja odbywa się poprzez pobieranie instrukcji w określonej kolejności, identyfikowanie ich typu i wykonywanie akcji związanych z tym typem. W C lub C++ możemy użyć instrukcji switch , aby powiązać niektóre akcje z różnymi znacznikami instrukcji. Współczesne kompilatory zwykle dość wydajnie kompilują switch z etykietami liczb całkowitych z wąskiego zakresu, przechowując adres instrukcji odpowiadający wartości ja -ta komórka specjalnej tablicy. Można to wykorzystać, biorąc wartości dla znaczników instrukcji z małego przedziału liczb całkowitych.
Specjalizacja dane i algorytmy
Istnieją sytuacje, w których wiele wystąpień przeznaczonych do długoterminowego przechowywania, a wywołania występują z różne w . Na przykład być może będziemy musieli najpierw sprawdzić, a następnie za , a następnie i tak dalej. W takich okolicznościach pełna specjalizacja z kompilacją może nie być odpowiednia ze względu na nadmierne wykorzystanie pamięci. Jednak czasami możemy znaleźć zwartą wyspecjalizowaną reprezentację dla każdego , które mogą być przechowywane z lub zamiast. . Definiujemy również wariant , jest zastępowane przez , przeznaczone do szybszego wykonywania tej samej pracy.
Zobacz też
- Psyco , wyspecjalizowany kompilator czasu wykonywania dla Pythona
- programowanie wieloetapowe
- A. Voronkov, „The Anatomy of Vampire: Implementing Bottom-Up Procedures with Code Trees”, Journal of Automated Reasoning , 15(2), 1995 ( oryginalny pomysł )
Dalsza lektura
- A. Riazanov i A. Voronkov, „Efficient Checking of Term Ordering Constraints”, Proc. IJCAR 2004, Lecture Notes in Artificial Intelligence 3097, 2004 ( zwarta, ale samodzielna ilustracja metody )
- A. Riazanov i A. Voronkov, Efficient Instance Retrieval with Standard and Relational Path Indexing , Information and Computation, 199(1-2), 2005 ( zawiera kolejną ilustrację metody )
- A. Riazanov, „Implementing an Efficient Theorem Prover” , rozprawa doktorska, The University of Manchester, 2003 ( zawiera najobszerniejszy opis metody i wiele przykładów )