Zaawansowane algorytmy i struktury danych/Wykład 14
Algorytmy równoległe II
W module tym zajmiemy się obliczaniem wyrażeń arytmetycznych i równoległymi obliczeniami na drzewach związanmi z tzw. kontrakcją drzew
Obliczanie wyrażeń arytmetycznych: algorytm jednoczesnych podstawień
Zakładamy, że wyrażenie zadane jest przez program sekwencyjny (w skrócie PS). Program taki jest sztywną sekwencją operacji, bez instrukcji warunkowych. PS jest bardzo prostym modelem obliczeńsekwencyjnych. Bardziej precyzyjnie, definiujemy program sekwencyjny jako ciąg instrukcji przypisań postaci, gdzie jest wyrażeniem arytmetycznym zawierającym operacji. W przypadku gdy operacjesą logiczne PS nazywamy obwodem logicznym (ang. boolean circuit). Ogólnie problem obliczenia wartości obwodulogiczngo jest P-zupełny, podobnie jest dla arytmetycznych programów sekwecyjnych. Problemy te są w klasie NC gdy graf związany z programem sekwencyjnym jest drzewem, a sam program odpowiada obliczaniu wyrażeniaarytmetycznego, co będziemy dalej zakładać.
Zmienne w programie sekwencyjnym są ponumerowane. Jeśli po lewej stronie instrukcji przypisaniajest zmienna a po prawej zmienna to wymagamy aby . Zakładamy, że struktura obliczeń jest drzewem oraz operacje są ze zbioru .
Sekwencyjna pojedyńcza operacja podstawiania polega na zastąpieniu zmiennej w danym wyrażeniu ,gdzie przez oraz redukcji wyrażenia po podstawieniu. \myskip Mówimy, że zmienna jest bezpieczna gdy jej prawa strona w programie sekwencyjnym (wyrażenie ) zawiera co najwyżej jednązmienną. W przykładzie poniżej pierwsze 5 zmiennych są bezpieczne.
Przykład
Rozważmy następujący program sekwencyjny :
, , , , ,
, , .
Na przykład po wykonaniu wszystkich bezpiecznych podstawień (w tym wypadku tylko zastąpienie przez ) do prawej strony dla x7 otrzymujemy
Operacja Reduce polega na wykonaniu jednocześnie wszystkich bezpiecznych podstawień we wszystkich wyrażeniach . W programie rozważamy tylko te zmienne, które są istotne z punktu widzenia liczenia ostatecznego wyniku . Zmienne te nazywamy istotnymi, są one osiągalne ze zmiennej w grafie programu. Oznaczmy przez Reduce(P) nowy program sekwencyjny, bez zmiennych nieistotnych.
Algorytm JP
(Algorytm Jednoczesnych-Podstawien)
repeat {Operacja Reduce}
for each do in parallel
wykonaj jednoczesnie wszystkie bezpieczne podstawienia w .
until obliczone;
Historia algorytmu dla przykładowego programu P danego powyżej wygląda następująco, gdzie Parser nie mógł rozpoznać (nieznana funkcja „\textsl”): {\displaystyle P=P_0, P_{i+1}= \textsl{Reduce}(P_i)} .
:
; ;
;
.
:
, .
:
.
Pokażemy, że algorytm wykonuje iteracji. Udwodnimy bardzo precyjne oszacowanie: rozmiar najmnieszego programu sekwencyjnego, który wmaga iteracji jest równy -tej liczbie Fibonacciego. Jest to zaskakująco podobne do analogicznego faktu dla drzew AVL, czas równoległy odpowiada wysokości drzewa.
Równoległa kontrakcja drzew
Grafem obliczeń programu sekwencyjnego jest skierowany graf acykliczny którego węzły odpowiadają zmiennych biorącym aktualnie udział w obliczeniu . Synami węzła (zmiennej) są zmiennewystępujące w danym momencie w . Graf zawiera tylko węzły osiągalne z korzenia . Przezrozmiar rozumiemy liczbę węzłów grafu (liczbę zmiennych w przypadku PS).
Zauważmy, że w danej iteracji algorytmu JP rozmiar grafu może być znacznie mniejszy niż , ponieważ wiele zmiennych możebyć nieosiągalnych z korzenia.
Jedna iteracja Reduce () odpowiada następującej operacji ,\ patrz rysunek.

Rysunek 1. Składowe operacje jednej iteracji Contract(T): Compress oraz Rake.
W rzeczywistości możemy zapomnieć o algorytmie JP i maszynie PRAM. Obliczanie na drzewie jestsamo w sobie sensownym modelem obliczeń równoległych. Czas równoległy jest liczbą iteracji, któraprzekształca początkowe drzewo w drzewo jednoelementowe. Z każdą krawędzią grafu jest związana pewna funkcja postaci:
gdzie są pewnymi stałymi. Początkowo funkcja ta jest identycznościowa. Jeśli w danym momencie następnikami węzła są, oraz to wartością zmiennej jest: , gdzie jest operacją arytmetyczną odpowiadającą węzłowi , w grafie obliczeń operacja ta jest niezmienna, podstawianie wyrażeń za zmienne odbywa się na funkcjeach na krawędziach. Jeśli wartości są obliczone (zmienne te odpowiadają aktualnie liściom) to wartość Parser nie mógł rozpoznać (nieznana funkcja „\otimesf”): {\displaystyle f_{e1}(x_j) \otimesf_{e2}(x_k)} jest konkretną końcową wartością zmiennej .
Rozważamy też spłaszczoną wersję drzewa T, odpowiadającą algorytmowi kontrakcji. W drzewie T' wewnętrzne węzły odpowiadają zmiennych programu sekwencyjnego lub krawędziom między zmiennymi, wartością krawędzi jest funkcja reprezentowana przez cztery stałe . Jeśli krawędź jest kompozycją dwóch krawędzi to wartością jest kompozycja funkcji . Kompozycja ta polega na wykonaniu operacji na czterch stałych odpowiadających funkcjom. Jeśli zależność jest tylko odjednej krawędzi to automatycznie rozumiemy że funkcja odpowiadająca pominiętej krawędzi jest identycznościowa (a takie są początkowo wszystkie funkcje w początkowym grafie ). Na następującym przykładzie pokażemy jak działa operacja Contract i w jaki sposób związana jest ona zalgorytmem JP.

Rysunek 2. Przykładowe drzewo wyrażenia, początkowe wartości w liściach są podane w kwadracikach, numery węzłów są w podane w nawiasach.

Rysunek 3. Drzewo razem z dodatkowymi funkcjami na krawędziach. Brak funkcji oznacza funkcję identycznościową.

Rysunek 4. Kolejne drzewa . Algorytm wykonuje 4 kontrakcje.

Rysunek 5. Spłaszczone drzewo liczące to samo co drzewo T, ale mające mniejszą wysokość(ogólnie logarytmiczną). Drzewo to można jeszcze bardzij spłaszczyć kompresując łańcuchy dwukrawędziowe(eliminując węzły wewnętrzne mające dokładnie jednego syna.
Oszacowanie liczby kontrakcji drzewa oraz iteracji algorytmu jednoczesnych podstawień
Załóżmy, że graf programu sekwenycjnego P jest drzewem T. Wtedy liczba iteracji algorytmu JP jest równa liczbie kontrakcji drzewa T, po której korzeń T staje się liściem. Przez oznaczmy maksymalną liczbę kontrakcji potrzebnych do zredukowania do jednego węzła drzewa o węzłach. Niech będziem -tą liczbą Fibonacciego,gdzie .Udowodnimy:
Twierdzenie
(a) .
(b) Parser nie mógł rozpoznać (błąd składni): {\displaystyle Fib_k \le n < Fib_{k+1'''\ \Rightarrow \ TIME(n)=k} .
Jako bezpośredni wniosek otrzymujemy:
gdzie jest liczbą tzw. złotego podziału (w przybliżeniu ).
Udowodnimy najpierw, że . Niech będzie -tym drzewem Fibonacciego, zdefiniowanym na rysunku. Drzewo powstaje przez utożsamienie korzeni dwóch początkowo rozłącznych wierzchołkowo drzew i , oraz dodanie nowego korzenia.

Rysunek 6. Drzewa Fibonacciego.
Pozostawiamy jako ćwiczenie uzasadnienie tego, że oraz .
Wynika stąd, że .
Przejdziemy teraz do dowodu następującego faktu.
Lemat o kontrakcji
.
Wprowadzamy pojęcie statycznego węzła, jako liścia, który nigdy nie może być odcięty,nie możemy usunąć krawędzi prowadzącej do niego. Poza tym operacja kontrakcji działa tak jak poprzednio. Narysunkach statyczny węzeł jest zaznaczony jako kwadracik. Jeśli drzewo ma dokładnie jeden statyczny węzeł,to po pewnej liczbie kontrakcji otrzymujemy drzewo składające się tylko z korzenia i tego węzła. Oznaczmy przez maksymalną liczbę kontrakcji dla drzewa mającego n węzłów, które doprowadzają do takiej sytuacji. W liczbę n nie wliczamy węzła statycznego.
Pozostawiamy jako ćwiczenie dowód tego, że .
Następujący dosyć oczywisty fakt jest użyteczny w dalszym dowodzie Lematu o Kontrakcji.
Fakt. Niech , oraz będą takie jak pokazane na Rysunku 7. Jeśli kontrakcji redukuje< math>T'</math> do drzewa rozmiaru jeden (nie licząc węzła statycznego), to po kontrakcjach drzewo redukuje się do pojedyńczego węzła staje się drzewem złożonym tylko z korzenia któreggo jedynem następnikiem jest liść lub element drzewa .

Rysunek 7. Graficzna definicja drzew , .
Udowodnimy lemat, który będzie rozszerzeniem Lematu o kontrakcji. Celowo wzmacniamy tezę aby ułatwić dowód przez indukcję.
Lemat Wzmocniony Lemat o kontrakcji
(a) ;
(b).
Dowód przeprowadzamy przez indukcję ze względu na . Dla , łatwo sprawdzić, że teza zachodzi. Załóżmy teraz, że teza zachodzi dla wszystich mniejszych niż dane.
Dowód punktu (a)
Rozważmy drzewo takie, że . Niech będzie najniższym (o najmnieszej wysokości) węzłem,takim że . Niech , będą następnikami , patrz Rysunek 8. (Jeśli ma tylko jednego następnika to nazwijmy go ). Zatem
Udowodnimy, że po -szej kontrakcjikorzeń staje się liściem. Możliwe są dwa przypadki:
Przypadek I: Po kontrakcji-giej węzeł jest liściem.
Z założenia indukcyjnego wynika, że drzewo jest zredukowane do korzenia z jednym następnikiem, który jest wewnątrz . Ponieważ wszystkie węzły w stały się liśćmi (gdyż korzeń stał się liściem) to w następnej kontrakcji wykonujemy operację Rake i korzeń całego drzewa staje się liściem.

Rysunek 8. Drzewo i jego dekompozycja: ,, , .
Przypadek II: Korzeń drzewa wymaga co najmniej kontrakcji by stał się liściem.
Dla drzewa niech będzie dodatkowym węzłem, a będzie nowym drzewemo korzeniu </math>vParser nie mógł rozpoznać (błąd składni): {\displaystyle mającym jednego następnka - korzeń R. łatwo widać, że co najmniej jedno z drzew }
T_p\otimesx</math> lub wymaga co najmniej kontrakcji aby korzeń stał się liściem. Przyjmijmy, bezstarty ogólności że jest to pierwsze z nich.
Z założenia indukcyjnego wynika, że (zatem . Wynika stąd,że drzewo z węzłem statycznym, patrz Rysunek 8, jest małe: Parser nie mógł rozpoznać (błąd składni): {\displaystyle |T2| \le FIB_{k-2]]} .
W tej sytuacji z założenia indukcyjnego (b) wynika, że drzewo jest zredukowane do korzenia z jednym liściem po kontrakcjach. Wszystkie węzły stają się liścmi po kontrakcjach na mocy założenia indukcyjnego (a).Zatem, podobnie jak w przypadku I korzeń całego drzewa staje się liściem po k-1 kontrakcjach.
Dowód punktu (b)
Przypadek ten rozpatruje się podobnie jak punkt (a), stosując odpowiednią dekompozycję drzewa .Dowód ten pozostawiamy jako ćwiczenie.
Obserwacja.Możliwe są różne inne definicje kontrakcji drzew. Na przykład moglibyśmy rozważać że w jednej iteracji kontrakcji napierw wykonujemy Rake (usuń liście) a dopiero potem Compress. My wykonywaliśmy to w jednym kroku równocześnie, co wydaje się bardzoej naturalne.