Kompilator Stalina brutalnie optymalizuje, ale jak?

14

Oświadczenie badawcze JM Siskinda stwierdza:

Stalin jest optymalizującym kompilatorem programu Scheme, który wykonuje analizę statyczną całego programu i wykorzystuje wyniki tej analizy do generowania wyjątkowo wydajnego kodu. Stalin wykorzystuje duży zbiór technik analizy statycznej. Wykonuje nowatorską formę analizy przepływu wielowariantowego, która wykorzystuje iterowaną analizę przepływu monowariantowego w celu wykonania podziału ukierunkowanego na przepływ: klonowania specjalistycznych kopii procedur i przypisywania obiektów docelowych do takich klonów dla poszczególnych połączeń. Wykorzystuje wyniki analizy przepływu do przeprowadzania analizy czasu życia, analizy ucieczki, analizy punktów do analizy i analizy niezbędnego aliasu. Analizy te wspierają nową formę lekkiej konwersji zamknięcia, która eliminuje większość szczelin zamykających, wykorzystując techniki takie jak zmienna globalizacja i lokalizacja, kompresuje statyczny łańcuch zamykający i zwykle eliminuje większość zamknięć z programów. Wykorzystuje również powyższe analizy do obsługi ukierunkowanego na przepływ zarządzania pamięcią opartą na regionie, w którym zbieranie śmieci w czasie wykonywania jest zastępowane statycznym przydzielaniem i zwalnianiem na podstawie wartości abstrakcyjnych i punktów na program. Wykonuje również ukierunkowaną na przepływ lekką konwersję CPS, wykorzystując rozszerzenia technik zapoczątkowanych przez Screamer, aby wspierać niezwykle wydajne kontynuacje pierwszej klasy. Wreszcie, obsługuje inklinację ukierunkowaną na przepływ i wybór reprezentacji niskiego poziomu, aby wybrać implementację (lub brak implementacji) tagów, sprawdzanie tagów i wysyłanie tagów na podstawie wartości abstrakcyjnych i punktów na program. Eliminuje to większość znaczników wykonawczych, sprawdzanie znaczników, oznaczanie, usuwanie znaczników, wysyłanie znaczników, boksowanie i rozpakowywanie z programów. gdzie wyrzucanie elementów bezużytecznych w czasie wykonywania jest zastępowane statycznym przydzielaniem i zwalnianiem na podstawie wartości abstrakcyjnych i punktów programowych. Wykonuje również ukierunkowaną na przepływ lekką konwersję CPS, wykorzystując rozszerzenia technik zapoczątkowanych przez Screamer, aby wspierać niezwykle wydajne kontynuacje pierwszej klasy. Wreszcie, obsługuje inklinację ukierunkowaną na przepływ i wybór reprezentacji niskiego poziomu, aby wybrać implementację (lub brak implementacji) tagów, sprawdzanie tagów i wysyłanie tagów na podstawie wartości abstrakcyjnych i punktów na program. Eliminuje to większość znaczników wykonawczych, sprawdzanie znaczników, oznaczanie, usuwanie znaczników, wysyłanie znaczników, boksowanie i rozpakowywanie z programów. gdzie wyrzucanie elementów bezużytecznych w czasie wykonywania jest zastępowane statycznym przydzielaniem i zwalnianiem na podstawie wartości abstrakcyjnych i punktów programowych. Wykonuje również ukierunkowaną na przepływ lekką konwersję CPS, wykorzystując rozszerzenia technik zapoczątkowanych przez Screamer, aby wspierać niezwykle wydajne kontynuacje pierwszej klasy. Wreszcie, obsługuje inklinację ukierunkowaną na przepływ i wybór reprezentacji niskiego poziomu, aby wybrać implementację (lub brak implementacji) tagów, sprawdzanie tagów i wysyłanie tagów na podstawie wartości abstrakcyjnych i punktów na program. Eliminuje to większość znaczników wykonawczych, sprawdzanie znaczników, oznaczanie, usuwanie znaczników, wysyłanie znaczników, boksowanie i rozpakowywanie z programów. wykorzystując rozszerzenia technik zapoczątkowanych przez Screamer, aby wspierać wyjątkowo wydajne kontynuacje pierwszej klasy. Wreszcie, obsługuje inklinację ukierunkowaną na przepływ i wybór reprezentacji niskiego poziomu, aby wybrać implementację (lub brak implementacji) tagów, sprawdzanie tagów i wysyłanie tagów na podstawie wartości abstrakcyjnych i punktów na program. Eliminuje to większość znaczników wykonawczych, sprawdzanie znaczników, oznaczanie, usuwanie znaczników, wysyłanie znaczników, boksowanie i rozpakowywanie z programów. wykorzystując rozszerzenia technik zapoczątkowanych przez Screamer, aby wspierać wyjątkowo wydajne kontynuacje pierwszej klasy. Wreszcie, obsługuje inklinację ukierunkowaną na przepływ i wybór reprezentacji niskiego poziomu, aby wybrać implementację (lub brak implementacji) tagów, sprawdzanie tagów i wysyłanie tagów na podstawie wartości abstrakcyjnych i punktów na program. Eliminuje to większość znaczników wykonawczych, sprawdzanie znaczników, oznaczanie, usuwanie znaczników, wysyłanie znaczników, boksowanie i rozpakowywanie z programów.Te analizy i optymalizacje pozwalają Stalinowi wygenerować niezwykle wydajny kod, który przewyższa wszystkie inne kompilatory Scheme, od czynników od dwóch do stu, szczególnie dla kodu intensywnie numerycznie. Stalin często generuje kod, który przewyższa ręcznie pisany kod C i kod Fortran.

Udało mi się znaleźć następujący bardzo interesujący artykuł na temat implementacji zamknięć / wywołań funkcji: Konwersja na lekką konwersję zamknięcia . Wysłałem również e-mail do autora, aby zapytać o artykuły na inne tematy, które są wymienione jako napisane w dokumencie do konwersji zamknięcia:

Siskind, JM 2000a. Lekka konwersja CPS ukierunkowana na przepływ. W przygotowaniu

Siskind, JM 2000b. Poliwariancja ukierunkowana na przepływ. W przygotowaniu

Siskind, JM 2000c. Wybór reprezentacji sterowanej przepływem. W przygotowaniu

Siskind, JM 2000d. Zarządzanie pamięcią masową ukierunkowane na przepływ. W przygotowaniu

Niestety, nigdy nie zaczął pisać tych dokumentów. Moje pytanie do Ciebie brzmi: czy są jakieś alternatywne lub powiązane dokumenty, które dotyczą tych tematów? Jestem bardzo zainteresowany, aby dowiedzieć się, w jaki sposób Stalin (lub inne kompilatory) może kompilować język wysokiego poziomu, taki jak Schemat, który jest zbieraniem śmieci, dynamicznie typowany, obsługuje funkcje pierwszej klasy, a nawet kontynuacje pierwszej klasy, może być statycznie skompilowany do tak wydajnego kodu . Chociaż prace na temat analizy przepływu są dość obfite, prace na temat wykorzystania wyników takiej analizy do optymalizacji wspomnianych powyżej nie są.

Jules
źródło

Odpowiedzi:

11

Kluczem jest prawdopodobnie fakt, że wykorzystuje analizę całego programu i optymalizację całego programu. Im więcej wiesz o tym, jak zachowuje się program, tym bardziej możesz się specjalizować, tworzyć i poprawiać wydajność.

Kompilator MLton dla Standard ML działa podobnie ( http://mlton.org/ ). Jest co najmniej jedna prezentacja na ten temat: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Wcześniejszą pracę wykonał Craig Chambers i jego grupa na University of Washington (na przykład: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Dokonano tego w kontekście Self, a później Cecil / Vortex.

Prawdopodobnie jest więcej pracy w społeczności Scheme / Lisp. Prawdopodobnie zechcesz rozważyć „optymalizację całego programu” w Google.

Dave Clarke
źródło