Algorytm Chaitin a Problem kolorowania grafu Krzysztof Lewandowski Mirosław Jedynak
Wstęp Szybkie zwiększenie prędkości procesorów wolniejszy rozwój prędkości dostępu do pamięci Kilkupoziomowy dostęp do pamięci (rejestry L1, L2, RAM, HD) Problem optymalnego wykorzystania poszczególnych rodzajów pamięci zadanie dla kompilatora
Przydział rejestrów Dostęp do rejestrów - najszybszy Zależne od architektury ilość i rodzaj rejestrów Z wymianą zawartości rejestrów związany jest dodatkowy koszt czas Najbardziej popularna metoda to k-kolorowanie grafu takie oznaczenie wszystkich wierzchołków grafu (korzystając z k kolorów), aby żadne sąsiadujące wierzchołki nie miały tego samego koloru G.J. Chaitin w publikacji pt. Register allocation via graph coloring zademonstrował, że problem przydziału rejestrów jest izomorficzny ze znanym problemem kolorowania grafu. k ilość rejestrów procesora Problem NP-zupełny dla k>2 algorytmy heurystyczne
Graf zależności W oparciu o kolejność instrukcji kompilator tworzy szereg grafów zależności (interference graph) Wierzchołek reprezentuje tymczasową wartość Krawędź (t 1,t 2 ) wskazuje że zmienne t 1 i t 2 nie mogą zostać przypisane do jednego rejestru (obie wartości są używane równocześnie)
Algorytm kolorowania 1. Build budowa grafów zależności na podstawie informacji o czasie życia zmiennych 2. Simplify Odkładanie na stos lokalnie kolorowalnych wierzchołków 3. Spill Jeśli nie jest możliwe k-kolorowanie grafu to wybranie wierzchołka przeznaczonego do przechowania w pamięci 4. Select Ściąganie ze stosu i kolorowanie wierzchołków
Algorytm kolorowania Dla grafu G i k kolorów: (1) Usuń z G wierzchołek v, którego ilość sąsiadów jest mniejsza niż k i odłóż go na stos (2) Usuń wszystkie krawędzie wychodzące v i powtarzaj (1) dopóki (a) v (b): (a) Graf G jest pusty (b) Nie ma wierzchołka z mniej niż k sąsiadami (3) Jeśli spełniony warunek (2a) to pokoloruj graf ściągając ze stosu wierzchołki v odtwarzając strukturę grafu, przypisując wierzchołkowi v kolor c, którym nie jest pokolorowany żaden z sąsiadów v (4) Jeśli spełniony (2b) wybierz wierzchołek v przeznaczony do przesłania do pamięci, usuń go z grafu i rozpocznij od początku
x = y++ + z
x = y++ + z #1: leaf y #2: operate #1 + 1 #3: assign y := #2 : leaf z : operate #2 + : assign x :=
x = y++ + z #1 #1: leaf y #2: operate #1 + 1 #3: assign y := #2 : leaf z : operate #2 + : assign x := #3 #2
x = y++ + z #1 #1: leaf y #2: operate #1 + 1 #3: assign y := #2 : leaf z : operate #2 + : assign x := #3 #2
x = y++ + z #1 #1: leaf y #2: operate #1 + 1 #3: assign y := #2 : leaf z : operate #2 + : assign x := #3 #2
#1 #2 #3 Problem przydziału 3 rejestrów 3-kolorowanie grafu #8 #0 #9
#1 #2 #3 #8 #9 #0 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
#1 #2 #3 #8 #9 #0 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
#8 3 2 1 #9 #0 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
#8 4 3 2 1 #9 #0 Brak wierzchołków o ilości sąsiadów mniejszej niż 3 rozpoczynanie od początku bez wierzchołka #8
#1 #2 #3 #9 #0 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
3 2 1 #9 #0 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
0 9 6 4 3 2 1 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
7 5 0 9 6 4 3 2 1 Wybieranie wierzchołków o ilości sąsiadów mniejszej niż 3
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 1 #9 Ściąganie ze stosu i kolorowanie wierzchołków
7 #1 #2 #3 5 0 9 6 4 #0 3 2 #9 3-kolorowanie zakończone 1
Niedoskonałości Nawet dla prostych grafów może nie znaleźć rozwiązania (niemożliwe 2-kolorowanie): Nie jest zorientowany na przepływ sterowania (np. pętle) Działa na etapie kompilacji bardziej wydajny byłby na etapie linkowania wywołania procedur; zmienne globalne
Podsumowanie Bardzo prosty algorytm dla grafów, które są k-kolorowalne działa w liniowym czasie w stosunku do liczby wierzchołków Inne bardziej wydajne algorytmy np. Chaitin-Briggs i Callahan-Koblenz Implementowany w większości kompilatorów