Polska Akademia Nauk Oddział w Gdańsku Komisja Informatyki Metody Informatyki Stosowanej Nr 2/2008 (Tom 15) Szczecin 2008
Metody Informatyki Stosowanej Kwartalnik Komisji Informatyki Polskiej Akademii Nauk Oddział w Gdańsku Komitet Naukowy: Przewodniczący: prof. dr hab. inż. Henryk Krawczyk, czł. koresp. PAN, Politechnika Gdańska Członkowie: prof. dr hab. inż. Michał Białko, czł. rzecz. PAN, Politechnika Koszalińska prof. dr hab. inż. Ludosław Drelichowski, Uniwersytet Technologiczno-Przyrodniczy w Bydgoszczy prof. dr hab. inż. Janusz Kacprzyk, czł. koresp. PAN, Instytut Badań Systemowych PAN prof. dr hab. inż. Leszek Rutkowski, czł. koresp. PAN, Politechnika Częstochowska prof. dr hab. inż. Piotr Sienkiewicz, Akademia Obrony Narodowej prof. dr inż. Jerzy Sołdek, Politechnika Szczecińska prof. dr hab. inż. Andrzej Straszak, Instytut Badań Systemowych PAN Recenzenci: prof. dr hab. inż. Ryszard Budziński, Uniwersytet Szczeciński prof. dr hab. inż. Andrzej Czyżewski, Politechnika Gdańska dr hab. Małgorzata Łatuszyńska, prof. US, Uniwersytet Szczeciński prof. dr hab. inż. Andrzej Piegat, Politechnika Szczecińska prof. dr hab. inż. Valeriy Rogoza, Politechnika Szczecińska prof. dr inż. Jerzy Sołdek, Politechnika Szczecińska prof. dr hab. inż. Andrzej Stateczny, Akademia Morska w Szczecinie dr hab. inż. Alexander Țariov, prof. PS, Politechnika Szczecińska dr hab. inż. Antoni Wiliński, prof. PS, Politechnika Szczecińska dr hab. Waldemar Wolski, prof. US, Uniwersytet Szczeciński prof. dr hab. inż. Oleg Zaikin, Politechnika Szczecińska Redaktor naczelny: Antoni Wiliński Sekretarz redakcji: Piotr Czapiewski ISSN 1898-5297 ISBN 978-83-925803-4-8 Wydawnictwo: Polska Akademia Nauk Oddział w Gdańsku Komisja Informatyki Adres kontaktowy: ul. Żołnierska 49 p. 104, 71-210 Szczecin Druk: Pracownia Poligraficzna Wydziału Informatyki Politechniki Szczecińskiej. Nakład 500 egz.
Spis treści Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič Obliczenie potęgi k znormalizowanej afinicznej relacji......... 5 Mariusz Borawski Vector space over the field of numbers in the mean value-pseudovariance representation............. 21 Ekaterina Kamenskaya, Georgy Kukharev Some aspects of automated psychological characteristics recognition from the facial image....................... 29 Janusz Korol Ilościowa ocena zmian regionalnego poziomu ochrony środowiska.. 39 Piotr Lech, Krzysztof Okarma An efficient low bitrate video transmission algorithm supported by the Monte Carlo method............................ 51 Kesra Nermend Rozwój przestrzennych systemów wspomagania decyzji......... 63 Marcin Ożarowski, Mirosław Plebanek, Zenon Ulman Detekcja nadmiaru multiplikatywnego w resztowym systemie liczbowym....................................... 69 Zbigniew Piotrowski, Jarosław Wątróbski Environmental factors as determinants of multicriteria methods suitability for a decision situation...................... 79 Mirosław Plebanek, Zenon Ulman, Marcin Ożarowski Porównywanie liczb w resztowym systemie liczbowym z wykorzystaniem parzystości.......................... 89 Jakub Swacha Cost-effective extension of data storage system............. 99 Łukasz Szełemej Przegląd metod ekstrakcji wiedzy w serwisach WWW Web Structure Mining................ 109 Alexandr Țariov Szybki algorytm realizacji bazowej operacji wyznaczania średniej kroczącej....................................... 117 Jarosław Wątróbski, Monika Stolarska Dobór systemów CRM w organizacji wirtualnej aspekt modelowy. 125 Paweł Ziemba, Mateusz Piwowarski Metody analizy wielokryterialnej we wspomaganiu porównywania produktów w Internecie............................. 137
Obliczenie potęgi k znormalizowanej afinicznej relacji Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič Politechnika Szczecińska, Wydział Informatyki Abstract: An approach to calculate the power k of an affine normalized relation is presented. A way to normalize an arbitrary affine relation is discussed. The approach is illustrated by an example. It is clarified how to calculate the positive transitive closure and transitive closure of a relation on the basis of the power k of the relation. Results of experiments are discussed. It is demonstrated how the calculated power k of a relation can be used for extracting both coarse- and fine-grained parallelism available in program loops. Feature research is outlined. Słowa kluczowe: affine loops, dependence, transitive closure, program transformation, parallelization 1. Wprowadzenie Dekompozycja trudnego obliczeniowo zadania na zbiór mniejszych wzajemnie niezależnych podproblemów to naturalny i dobrze znany sposób skrócenia czasu jego wykonania. Zaprezentowano dotąd liczne algorytmy umożliwiające realizację takiego podejścia zarówno w sposób równoległy jak i rozproszony [18], [19], [20], [21], [22]. Jednak badania w tej dziedzinie nadal trwają i koncentrują się głównie w dążeniu do wyeksponowania maksymalnej równoległości zawartej w pętlach. Jeśli za formę reprezentacji zależności przyjmiemy graf, w którym wierzchołki symbolizują kolejne iteracje pętli a krawędzie zależności, to powodzenie przedsięwzięcia w znacznym stopniu uzależnione jest od możliwości obliczenia domknięcia przechodniego takiego grafu, czyli ogólnie rzecz ujmując, zbioru wierzchołków osiągalnych z dowolnego węzła startowego. Nie stanowi to specjalnej trudności, jeśli ograniczymy się do grafów, w których liczba wierzchołków jest wartością stałą. Wówczas zastosować można jeden z dobrze znanych algorytmów przeszukiwania w głąb (ang. depth-first search) lub przeszukiwania wszerz (ang. breadth-first search). Niestety powyższe metody nie sprawdzają się w przypadku grafów sparametryzowanych, czyli takich, których liczba wierzchołków i krawędzi nie jest znana w momencie kompilacji. Wymagają one bowiem doboru odpowiedniej formy reprezentacji grafu jak i opracowania algorytmów umożliwiających obliczenie na jej podstawie wymaganego domknięcia przechodniego. O ile w przypadku wymagania pierwszego zastosowanie relacji krotek i arytmetyki Presburgera powinno
6 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič być wystarczające, kwestia opracowania algorytmów rozwiązujących przedstawiony problem w sposób dokładny pozostaje nadal otwarta. Znane narzędzia starają się zwrócić w miarę możliwości dokładne rozwiązanie, jednak zgodnie z obecnym stanem wiedzy nie jest to możliwe w przypadku ogólnym. Wówczas musimy zadowolić się swego rodzaju aproksymacją. W artykule tym przedstawiony jest sposób obliczania domknięcia przechodniego w sposób dokładny, ograniczając się do grafów opisanych za pomocą pojedynczej znormalizowanej afinicznej relacji. 2. Pojęcia podstawowe W artykule rozważane są idealnie zagnieżdżone pętle afiniczne, w których dolne oraz górne granice pętli, a także odwołania do tablic oraz instrukcji warunkowych są określone przy pomocy funkcji afinicznych, których argumentami są indeksy otaczających pętli oraz opcjonalnie parametry strukturalne [1]. Kroki pętli są znanymi, stałymi liczbami całkowitymi. Aby iteracje pętli mogły być wykonywane równolegle na niezależnych procesorach, nie może wystąpić sytuacja, gdy jedna z iteracji dokonuje zapisu a inna zapisu lub odczytu tej samej komórki pamięci. Jeżeli istnieją iteracje pętli, które nie spełniają tego warunku, to mówimy, że występuje pomiędzy nimi zależność i nie mogą być one wykonywane równolegle, lecz muszą być wykonywane zgodnie z kolejnością wykonania w pętli sekwencyjnej, którą to kolejność określa się mianem porządku leksykograficznego. Prezentowane podejście wymaga zastosowania dokładnej analizy zależności, w wyniku której otrzymujemy graf skierowany, w którym krawędzie symbolizują istniejącą zależność. Utworzenie takiego grafu w czasie kompilacji nie zawsze jest możliwe (np. nie są znane parametry granic pętli, czyli liczba wierzchołków symbolizujących iteracje). Nawet, jeśli możliwe jest utworzenie grafu zależności pomiędzy iteracjami w czasie kompilacji, to takie rozwiązanie nie zawsze jest efektywne liczba wierzchołków w grafie jest równa liczbie iteracji pętli. W artykule do analizy zależności wybrano narzędzie Petit [6]. W programie tym zależności reprezentowane są w postaci relacji, czyli odwzorowania przekształcającego jedną przestrzeń iteracji w drugą, przedstawionego przy pomocy wyrażeń liniowych, których argumentami są zmienne odpowiadające indeksom pętli dla początku i końca zależności oraz stałe. Z szeregu zalet, jakie posiadają relacje krotek, na szczególną uwagę zasługuje to, że mogą być one sparametryzowane. Przykładowa postać takiej relacji jest następująca: {[i] [i + 2] : 1 i n 2} (1) W konsekwencji, możliwe jest przy ich pomocy, ustalenie domknięcia przechodniego dla grafów sparametryzowanych. Istnieją dwie relacje związane z domknięciem przechodnim [3] i określone są przez następujące wzory: 1) domknięcie przechodnie: x z R x = z y s.t. x y R y z R (2) 2) dodatnie domknięcie przechodnie: x z R + x z R y s.t. x y R y z R + (3)
Obliczenie potęgi k znormalizowanej afinicznej relacji 7 Zależność między domknięciem przechodnim a dodatnim domknięciem przechodnim przedstawia następujący wzór: R = R + I (4) gdzie I relacja tożsamości, np. I = {[i] [i] : ograniczenia dla i}. Przykładowa relacja przedstawiająca domknięcie przechodnie dla grafu opisanego przy pomocy relacji (1) wygląda następująco: {[i] [i ] : β : i i = 2β 1 i i n} (5) Proces wyznaczania domknięcia przechodniego dla grafu opisanego przy pomocy relacji R poprzedzony jest koniecznością wyznaczenia relacji R k postaci: gdzie: R k = R k (6) k=1 R k = R R k 1 R k 1 = R R k 2... R 1 = R R 0 = I jest operatorem kompozycji relacji. W kolejnym rozdziale zaprezentowana jest metoda wyznaczania relacji R k dla pojedynczej relacji R. Autorzy zakładają, że czytelnik zna podstawy związane z akademickimi narzędziami Petit i Omega kalkulator do znajdowania zależności w postaci relacji oraz do wykonywania operacji na relacjach i zbiorach, a także do generowania kodu. Szczegóły można znaleźć w [6]. 3. Wyznaczanie relacji R k dla pojedynczej znormalizowanej relacji afinicznej Przed przystąpieniem do wyznaczania relacji R k dla prezentowanego podejścia, niezbędne jest aby rozważana relacja R spełniała następujące wymagania: 1. Relacja nie może być sumą wielu relacji, których krotki wyznaczające początki i końce są różne. 2. Każdy koniec/początek zależności opisywanej przez krotkę relacji posiada dokładnie jeden początek/koniec, tzn. nie istnieją wspólne końce/początki dla dwóch lub większej liczby krawędzi opisanych przy pomocy rozważanej relacji. 3. Liczba zmiennych zawartych w opisie relacji, musi być mniejsza lub równa ilości zmiennych indeksujących pętli. Jeżeli rozważana relacja R nie spełnia powyższych wymagań należy przystąpić do procedury normalizacji takiej relacji. Wygląda ona następująco: (7)
8 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič 1. Jeżeli rozważana relacja R jest sumą wielu relacji, których krotki wyznaczające początki i końce są różne, to taki przypadek dotyczy obliczania potęgi unii relacji; przypadek ten nie jest rozpatrywany w danym artykule i tym samym kończymy proces normalizacji, informując o braku możliwości obliczenia potęgi k dla relacji wejściowej. Jeśli jednak rozważana relacja jest sumą relacji, których krotki wyznaczające początki i końce są jednakowe, wówczas tworzymy jedna relacje, która zawiera połączenie ograniczeń wszystkich relacji za pomocą operatora OR. 2. Dla relacji utworzonej w kroku 1, sprawdzamy czy każdy koniec/początek posiada dokładnie jeden początek/koniec, tzn. dla dowolnego początku d domain(r i )/końca r range(r i ) istnieje dokładnie jeden koniec range(r i (d))/początek domain(r 1 i (r)), co jest równoważne z tym, że nie istnieją takie d i i d j, że d i d j i R(d i ) = R(d j ) / r i i r j, że r i r j i R 1 (r i ) = R 1 (r j ). Jeżeli warunek nie jest spełniony to należy spróbować usunąć nadmiarowe zależności z relacji R i, korzystając ze znanych metod i tym samym wyodrębnić krawędzie podstawowe w taki sposób aby były opisane za pomocą tych samych krotek wyznaczających początki i końce. W przypadku sukcesu, przechodzimy do kroku 3. Inaczej koniec normalizacji i poinformowanie o braku możliwości obliczenia potęgi k wejściowej relacji. 3. Rozwiązujemy wszystkie równania będące elementami ograniczenia relacji R. Niech x = a będzie przykładowym rozwiązaniem jednego z takich równań, wówczas zastępujemy wszystkie wystąpienia zmiennej x rozwiązaniem a w ramach relacji R i jej ograniczeniach. 4. Rozwiązujemy wszystkie nierówności będące elementami ograniczenia relacji R. Dla relacji (8): R = {[i, j] [i, j] : j + 1 = 0 1 i < i 25} {[i, j] [i, j] : j + 1 = 0 10 i < i 50} po wykonaniu kroku 1, otrzymujemy relację (9) z ograniczeniami połączonymi za pomocą operatora OR: { } [i, j] [i, j] : j + 1 = 0 1 i < i 25 OR R = j + 1 = 0 10 i < i (9) 50 A po wykonaniu kroków 2-4, przekształcamy relację R do następującej postaci: R = {[i, 1] [i + 1, 1] : 1 i 24 OR 10 i 49} (10) Dysponując znormalizowaną postacią relacji R (10) możemy przystąpić do wyznaczania relacji R k. Pierwszym krokiem procedury jest wyznaczenie zbioru domain(r) range(r). Jeżeli jest on zbiorem pustym, oznacza to, iż żaden z końców relacji nie należy jednocześnie do jej początków i tym samym relacja R k przyjmuje postać: { } R k R dla k = 1 = (11) dla k > 1 (8)
Obliczenie potęgi k znormalizowanej afinicznej relacji 9 W przeciwnym wypadku, zważywszy na fakt, że połączone krawędzie znormalizowanej relacji symbolizujące istniejące zależności, tworzą łańcuchy o początkach należących do zbioru domain(r) i końcach w zbiorze range(r), możliwe jest wygenerowanie wyrażenia wyznaczającego poszczególne wierzchołki należące do takich łańcuchów dla zadanych wartości k. Realizowane jest to za pomocą układu równań rekurencyjnych. Dla znormalizowanej relacji R postaci (12): a 11 a 12... a 1n i 1 b 1 a 21 a 22... a 2n R =............ i 2... + b 2... a n1 a n2... a nn i n b n c 11 c 12... c 1n i 1 d 1 c 21 c 22... c 2n............ i 2... + d 2... c n1 c n2... c nn i n d n ograniczenia na R (12) gdzie ograniczenia nałożone na relację R (12) spełniają następujące wymagania: 1) indeksy pętli zawierają się pomiędzy jej ograniczeniami: dolnym i górnym, 2) początki zależności są leksykograficznie mniejsze niż odpowiadające im końce, 3) składowe relacji definiują odpowiednio początki i końce zależności, układ równań rekurencyjnych wraz z wartościami początkowymi wygląda następująco: a 11 a 12... a 1n i k 1 b 1 c 11 c 12... c 1n i k 1 1 d 1 a 21 a 22... a 2n i k 2............... + b 2... = c 21 c 22... c 2n i k 1 2............... + d 2... (13) a n1 a n2... a nn b n c n1 c n2... c nn in k 1 d n i k n i 0 1 i 0 2... = i 0 n t 1 t 2... t n (14) Dla przykładowej relacji: R = {[i] [i + 1]}, tworzymy równanie rekurencyjne: i k = i k 1 + 1, którego rozwiązaniem względem wartości początkowej i 0 jest: i k = i 0 + k. Układy równań rekurencyjnych (13) z ograniczeniami (14) mogą być rozwiązywane przez wiele akademickich i komercyjnych narzędzi takich jak: Maple [23], Mathematica [24], Maxima [25], MuPAD [26], PURRS [27]. Na potrzeby badań wykonanych w dalszej części tej publikacji, wykorzystano funkcjonalność oferowaną przez oprogramowanie dostępne w Mathematica. Dysponując rozwiąza-
10 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič niem [i k,t 1, ik,t 2,...,ik,t n ] układów równań (13) i (14) możliwe jest utworzenie relacji R k postaci (15): [ ] [t 1, t 2,..., t n ] x k,t 1, xk,t 2,..., xk,t n : t = [t 1, t 2,..., t n ] domain(r) } {{ } [ 1 ] x k,t R k j = i k,t j 1 j n x k,t = x k,t 1 = } {{ }, xk,t 2,..., xk,t n range(r) } {{ } (15) 2 [ ] 3 x k,t = x k,t 1, xk,t 2,..., xk,t n R + (t) k 1 } {{ } 4 gdzie t = [t 1, t 2,..., t n ] oraz [x k,t 1, xk,t 2,...,xk,t n ] określają odpowiednio wejściową oraz wyjściową krotkę relacji R k, a kolejne ograniczenia oznaczają: 1. Ograniczenia nałożone na składowe krotki wejściowej relacji R k. 2. Wyrażenie wyznaczające wartości poszczególnych składowych krotki wyjściowej relacji R k dla zadanych wartości k oraz t. 3. Ograniczenia na składowe krotki wyjściowej relacji R k do zbioru range(r). 4. Relacja R k generuje zależności przechodnie tylko i wyłącznie dla tworzących je zależności bezpośrednich, reprezentowanych przez relację R. Oznacza to, że relacja R k nie może zawierać dodatkowych zależności przechodnich, które nie wynikają z występowania i przebiegu zależności bezpośrednich. Ograniczenie to dotyczy relacji, których łańcuchy powstałe w wyniku występowania zależności posiadają przerwy, czyli w ramach ograniczeń wyznaczających dziedzinę relacji R, mogą pojawić się wierzchołki, które zostały z niej wykluczone (wierzchołek jest końcem zależności ale nie jest początkiem żadnej zależności). Ponieważ procedura wyznaczania relacji R k dla takich relacji może wprowadzić zależności nadmiarowe, a wyznaczenie dokładnego domknięcia przechodniego relacji R nie zawsze jest możliwe (przykładowo Omega Calculator nie zawsze jest w stanie obliczyć dokładne domknięcie przechodnie dla relacji afinicznej), ograniczenie 4 można zapisać w następującej formie: (k : 1 k < k x k,t UDD) (16) gdzie UDD (ang. Ultimate Dependence Destination) określają wierzchołki, które nie są początkami żadnej zależności. Przeciwieństwem takich wierzchołków jest zbiór UDS (ang. Ultimate Dependence Sources), którego wierzchołki z kolei nie są końcami żadnej zależności. Symbol oznacza negację, jest kwantyfikatorem egzystencjalnym. Ograniczenie (16) nie dopuszcza nadmiarowych zależności między przerwami w łańcuchach, powstałych w wyniku występowania nieciągłości łańcuchów zależności, czyli między wierzchołkami, które są końcami zależności ale nie są początkami żadnej zależności lub są wierzchołkami całkowicie niezależnymi. Aby relacja R k (15) nie zawierała zbytecznych ograniczeń, musimy zagwarantować, że ograniczenie czwarte będzie wprowadzane tylko wtedy gdy jest ono
Obliczenie potęgi k znormalizowanej afinicznej relacji 11 niezbędne, czyli wtedy gdy mamy do czynienia z relacją, która opisuje łańcuchy zależności posiadające przerwy. Można to sprawdzić wykonując następujące kroki. Dla danej relacji R wyznaczamy: 1. Zbiór wierzchołków U DS = domain(r) range(r). 2. Zbiór wierzchołków U DD = range(r) domain(r). 3. Pojedynczy wypukły region opisujący U DS U DD: Hull(U DS U DD). 4. Relację r opisaną na pojedynczym regionie otrzymanym w punkcie 3. Biorąc pod uwagę, że r (18) opisuje łańcuchy zależności nieprzerwane na obszarze tworzonym przez wszystkie początki i końce zależności opisywane przez R, to warunek r R = oznacza, że relacja R opisuje nieprzerwane łańcuchy zależności, w przeciwnym wypadku relacja R opisuje łańcuchy przerywane, a różnicę stanowią krawędzie powstałe w miejscach przerw relacji R. Przykładowo dla relacji (17): R = {[i] [i + 1] : (α : 2, 4 α + 2 i 1000, 4 α + 3)} (17) 1. UDS = {[2]} {[i] : (α : i = 2 + 4 α 6 i 998)} UDD = {[i] : (α : i = 4 α 4 i 1000)} 2. Hull (UDS UDD) = {[i] : 2 i 1000} 3. r = {[i] [i ] : i = i + 1 2 i, i 1000} (18) r R Relacja R (17) opisuje łańcuchy zależności, które posiadają przerwy i tym samym wprowadzenie ograniczenia 4-ego do relacji R k jest niezbędne. Rozważmy przykład tworzenia relacji R k wraz z odpowiednimi ograniczeniami. Dla danej pętli: for i = 1 to n do for j = 1 to n do a(i+1, 4*j n) = a(i,2*j) (19) endfor endfor Petit znalazł następującą relację zależności (20): R ={[i, j] [i + 1, j ]: n+2j =4j 1 j 3j 4j 1 i i+2j <4j} (20) Relacja wymaga normalizacji. Postać relacji po znormalizowaniu: R = {[i, 2 j] [i + 1, 4j n]: 1 i < n 4j 2 4j 3n} (21) 1. Tworzymy postać wyrażenia rekurencyjnego: { } x k+1 1 = x k 1 + 1 2 x k+1 2 = 4 x k 2 n z wartościami początkowymi: { x 0 1 = t 1 x 0 2 = t 2 } (22) (23)
12 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič Jego rozwiązaniem jest: { x k,t1 1 = t 1 + k x k,t2 2 = 1 2 (n 2k n + 2 2 k t 2 ) } (24) 2. Ustalamy zbiór domain(r): {[i, j]: (alpha: 0 = n + 2alpha 1 i < n 4j 2 4j 3n)} (25) 3. Obliczamy zbiór range(r): {[i, j]: (alpha: n = 2j + 4alpha && 2 i n 1 j n)} (26) 4. Ustalamy zbiór wierzchołków UDS: {[1, j]: (α: 0 = n + 2 α n 4j 2 4j 3n)} {[i, j]: (α: n = 2 + 2j + 4 α 2 i < n 4j 2 4j 3n)} (27) 5. Obliczamy zbiór wierzchołków UDD: {[n, j]: (α: n = 2j + 4α 1 j n)} {[i, j]: (α: n = 2j + 4α 2 i < n 4j n 1 j)} {[i, j]: (α: n = 2j + 4α 2 i < n j n 2 + 3n 4j)} (28) 6. Sprawdzamy czy dana relacja opisuje łańcuchy zależności, które mogą posiadać przerwy: Ustalamy pojedynczy wypukły region relacji R (21): Hull(UDS UDD). {[i, j]: 1 i n 1 j n} (29) Definiujemy relację r (30) tożsamą z R (21) ograniczoną powyższym regionem (29): r ={[i, j] [i, j ]: i =i+1 2j =4j n 1 i, i n 1 j, j n} (30) r R = relacja R nie opisuje łańcuchów zależności, które mogą zawierać przerwy Warunek nie jest spełniony więc takiego niebezpieczeństwa nie ma. 7. Tworzymy relację R k zgodnie z szablonem (15): [t 1, t 2 ] [x k,t1 1, x k,t2 2 ]: k 1 (α: 0 = n + 2α 1 t 1 < n 4 t 2 2 4 t 2 3n) } {{ } 1 R k = x k,t1 1 = t 1 + k x k,t2 2 = 1 2 (n 2 k n + 2 2 k ) t 2 } {{ } 2 (α: n = 2 x k,t2 2 + 4 α 2 x k,t1 1 n 1 x k,t2 2 n) } {{ } 3 (31)
Obliczenie potęgi k znormalizowanej afinicznej relacji 13 8. Tworzymy relację R + poprzez dodanie kwantyfikatora do relacji R k (31): [t 1, t 2 ] [x k,t1 1, x k,t2 2 ]: (k: k 1 (α: 0 = n + 2α 1 t 1 < n 4 t 2 2 4 t 2 3n) } {{ } 1 R + = x k,t1 1 = t 1 + k x k,t2 2 = 1 2 (n 2 k n + 2 2 k ) t 2 (32) } {{ } 2 (α: n = 2 x k,t2 2 + 4 α 2 x k,t1 1 n 1 x k,t2 2 n)) } {{ } 3 9. Tworzymy relację R = R + I, gdzie R = I = ( R 1 R ) ( R R 1) (33) [t 1, t 2 ] [x k,t1 1, x k,t2 2 ]: (k: k 1 (α: 0 = n + 2α 1 t 1 < n 4 t 2 2 4 t 2 3n) } {{ } 1 x k,t1 1 = t 1 + k x k,t2 2 = 1 2 (n 2 k n + 2 2 k ) t 2 } {{ } 2 (α: n = 2 x k,t2 2 + 4 α 2 x k,t1 1 n 1 x k,t2 2 n)) } {{ } 3 [t 1, t 2 ] [t 1, t 2 ]: (α: 0=n+2α 1 t 1 <n 4 t 2 2 4 t 2 3n) } {{ } [t 1, t 2 ] [t 1, t 2 ]: (α: n=2t 2 +4α 2 t 1 n 1 t 2 n) } {{ } W kolejnym rozdziale przedstawiony jest zestaw przykładowych pętli, których zależności są opisywane pojedynczymi relacjami zależności, dla których wyznaczono relacje R + zgodnie z zaprezentowanym podejściem. 4. Wyniki badań Tabela 1 zawiera pięć pętli (lewa kolumna), których zależności są opisywane za pomocą tylko pojedynczej relacji (prawa kolumna). Warto zwrócić uwagę na to, że wszystkie pętle są niejednolite i żadne ze znanych narzędzi nie radzi sobie z obliczeniem dokładnego tranzytywnego domknięcia tych relacji. Natomiast zaproponowane w danym artykule podejście pozwala na obliczenie tranzytywnego domknięcia każdej z tych relacji w oparciu o wcześniej wyznaczoną relacje R k, wyniki zawarte są w Tabeli 2. 1,3 1,3 (34)
14 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič Tabela 1. Pętle wykorzystane w badaniach i odpowiadające im relacje zależności Nr Pętla Relacja zależności 1 for i=1 to 1000 do for j=1 to 1000 do a(i,j)=a(i,2*j) endfor endfor R = {[i, j] [i,2j]: 1 i 1000 1 j 500} 2 for i=1 to 1000 do for j=1 to 1000 do a(i,j)=a(i,2*n-j) endfor endfor R = {[i, j] [i,2n j]: 1 i 1000 2n 10001 j < n} 3 for i=1 to 1000 do for j=1 to 1000 do a(2*j+3,i+1)=a(i+j+3,2*i+1) endfor endfor R = {[i,2 j] [2i, i + j]: 1 i 500 1 j 1000} 4 for i=1 to 1000 do for j=1 to 1000 do a(i+j+4,2*i+1)=a(2*j+3,i+1) endfor endfor R = {[i,2 j] [2i, i + j + 1]: 1 i 500 1 j 1000} 5 for i=2 to 1000 do if ((i mod 3)>=0 and (i mod 3)<=2) then a(i)=a(i+1) endif endfor R = {[i] [i + 1]: (α: 2, 4 α + 2 i 1000, 4 α + 3)}
Obliczenie potęgi k znormalizowanej afinicznej relacji 15 Tabela 2. Wyznaczona relacja R + dla danej relacji R Nr Relacja R + [t 1, t 2] [x k,t 1 1, x k,t 2 2 ]: (k: k 1 1 t 1 1000 1 t 2 500 } {{ } 1 1 R + = x k,t 1 1 = t 1 x k,t 2 2 = t 2 2 k } {{ } 2 (α: 2 α = x k,t 2 2 1 x k,t 1 1 1000 2 x k,t 2 2 1000)) } {{ } 3 2 R + = R = [i, j] [i, 2n j]: 1 i 1000 2n 1000, 1 j < n } {{ } 3 R + = [t 1, t 2] [x k,t 1 1, x k,t 2 2 ]: (k: k 1 (α: 2α = t 1 + t 2 1 t 1 500 1 t 2 1000) } {{ } 1 x k,t 1 1 = t 1 2 k x k,t 2 2 = 1 3 2 k ( t 1 + 4 k t 1 + 3 t 2) } {{ } 2 (α: 0 = x k,t 1 1 + 2α 4 x k,t 2 2 2000, 2 x k,t 1 1 4 x k,t 2 2 2,1000)) } {{ } 3 [t 1, t 2] [x k,t 1 1, x k,t 2 2 ]: (k: k 1 (α: 2α = 1 + t 1 + t 2 1 t 1 500 1 t 2 1000) } {{ } 1 4 R + = x k,t 1 1 = t 1 2 k x k,t 2 2 = 1 3 2 k ( 3 + 3 2 k t 1 + 4 k t 1 + 3 t 2) } {{ } 2 (α: 0 = x k,t 1 1 + 2 α 4 x k,t 2 2 2002, 2 x k,t 1 1 4 x k,t 2 2 4, 1000) ) } {{ } 3 [t 1] [x k,t 1 1 ]: (k: k 1 (α: 2,4 α + 2 i 1000, 4 α + 3) } {{ } 1 5 R + = x k,t 1 1 = t 1 + k (α: 3, 4 α + 3 x k,t 1 1 1001, 4 α + 4) } {{ } } {{ } 2 3 (k : 1 k < k (α: t 1 + k = 4 α 4 t 1 + k 1000)) ) } {{ } 4 1
16 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič 5. Zastosowanie Wyznaczenie relacji R k, R + i R dla danej relacji R, symbolizującej zależności zawarte w pętli stwarza możliwość ich wielorakiego zastosowania. Interesujące są szczególnie te, które dotyczą bezpośrednio transformacji pętli programowych. Aktualnie najmocniejsze z nich to przekształcenia afiniczne, polegające na wyznaczeniu harmonogramu (ang. schedule) dla każdej instancji instrukcji zawartej wewnątrz pętli. Harmonogram jest to odwzorowanie, które określa czas wykonania każdej iteracji poprzez wyznaczenie funkcji θ(s, I): Ω N nd N (n D rozmiar przestrzeni iteracji, Ω zbiór instrukcji {S 1,..., S k } w pętli), w taki sposób, aby honorować występujące pomiędzy nimi zależności. Spośród wszystkich możliwych harmonogramów instancji instrukcji wyróżniony jest tak zwany harmonogram swobodny (ang. free schedule [1]). Polega on na tym, że iteracje wykonywane są natychmiast, kiedy tylko są dostępne (już obliczone) wszystkie ich operandy. θ free (S, I) można przedstawić w formie: θ free (S, I) = { 0 if ( S (I )S (I ) S(I)) 1 + max θfree (S,I )(S (I ) S(I)) Taki harmonogram jest optymalny i znajduje maksymalną równoległość zawartą w pętli. Rozważmy przykład zastosowania relacji R k dla pętli nr 1 z Tabeli 1, w transformacji metodą wyznaczenia harmonogramów swobodnych. Jako pierwsze, czyli w czasie θ free (S, I) = 0 wykonywane są iteracje niezależne i te należące do zbioru UDS, otrzymane w następujący sposób: } (35) LD = {[i, j]: 1 i 1000 1 j 1000} (36) IND = LD (domain(r) range(r)) (37) UDS = (domain(r) range(r)) = = {[i, j] : (α: 2 α = 1 + j 1 i 1000 1 j 499} gdzie LD (36) to przestrzeń iteracji pętli, a domain(r) i range(r) to zbiory kolejno zawierające początki i końce iteracji zależnych. Kolejne iteracje wykonywane są zgodnie z porządkiem narzuconym przez relację R k. Wyznaczając wartość k max : otrzymujemy: [ 1 0 0 1 ] [ t 1 t 2 2 k ] + [ 0 0 ] [ 1000 1000 t 1 1000, t 2 2 k 1000 2 k 1000 t 2 k log 2 1000 t 2 ; podstawiamy minimalną wartość dla składowej t 2 ze zbioru UDS (38): min(t 2 ) = 1, więc k log 2 1000 1 ] k log 2 1000 (38)
Obliczenie potęgi k znormalizowanej afinicznej relacji 17 k max = 9 (39) i ograniczając dziedzinę relacji R k do zbioru wierzchołków UDS: R k \UDS, możemy przystąpić do wygenerowania zbioru określającego kolejne harmonogramy swobodne w zależności od wartości kroku k: S(k) = range(r k ) (40) { } [t 1, t 2 ]: (α: 2 2 k α = 2 k + t 2 1 t 1 1000 S(k) = 2, 1 2 k t 2 1000, 499 2 k (41) ) Jest to etap końcowy, umożliwiający wygenerowanie pętli skanujących poszczególne iteracje należące do zbiorów: IND (37), UDS (38) i S(k) (41). Wygenerowany kod równoległy przedstawiono na Rys. 1 i 2. Relację R można wykorzystać w poszukiwaniu iteracji nie wymagających synchronizacji. Podejście to nie różni się znaczącą od metody transformacji pętli po- # kod skanujący wierzchołki niezależne codegen IND parfor(t1 = 1; t1 <= 1000; t1++) { parfor(t2 = 501; t2 <= 999; t2 += 2) { s1(t1,t2); } } # kod skanujący wierzchołki UDS codegen UDS parfor(t1 = 1; t1 <= 1000; t1++) { parfor(t2 = 1; t2 <= 499; t2 += 2) { s1(t1,t2); } } Rysunek 1. # kod skanujący wierzchołki zbioru S(k) wygenerowany ręcznie for(k=1; k<=9; k++) { parfor(t1=1; t1<=1000; t1++) { parfor(t2 = max(2, 2^k); t2 <= min(1000, 499*2^k); t2 += 2*2^k) { s1(t1,t2); } } } Rysunek 2.
18 Włodzimierz Bielecki, Tomasz Klimek, Konrad Trifunovič # kod skanujący wierzchołki niezależne codegen IND parfor(t1 = 1; t1 <= 1000; t1++) { parfor(t2 = 501; t2 <= 999; t2 += 2) { s1(t1,t2); } } # kod skanujący wierzchołki niezależne codegen IND parfor(t1 = 1; t1 <= 1000; t1++) { parfor(t2 = 501; t2 <= 999; t2 += 2) { s1(t1,t2); } } Rysunek 3. # kod skanujący wierzchołki zbioru S(k) wygenerowany ręcznie parfor(t1 = 1; t1 <= 1000; t1++) { parfor(t2 = 1; t2 <= 499; t2 += 2) { for(k = 1; k <= floor(log(1000)/log(t2)); k++) { s1(t1,t2*2^k); } } Rysunek 4. legającej na wyznaczeniu harmonogramów swobodnych i dotyczy głownie sposobu generowania pętli skanującej relację S(k) = range(r \UDS). Przedstawia to kod na Rys. 3 i 4. 6. Podsumowanie W niniejszej pracy zaprezentowane zostały metody tworzenia relacji R k, R + i R, dzięki którym możliwe jest wyeksponowanie zarówno drobnoziarnistej (R k i wyznaczenie harmonogramów swobodnych) jak i gruboziarnistej (R i poszukiwanie łańcuchów nie wymagających synchronizacji) równoległości zawartej w pętlach. Każda z tych relacji zawiera informacje dotyczące domknięcia przechodniego dla rozważanej relacji R na różnym poziomie szczegółowości. Jak zdążyliśmy się przekonać, relacje opisujące owe domknięcia (Tabela 2) nie zawsze są relacjami afinicznymi. Wiążą się z tym faktem różnorodne problemy, począwszy od braku możliwości stosowania arytmetyki Presburger a i narzędzi na niej bazujących, które dostarczają funkcjonalności związanej z wykonywaniem elementarnych operacji na zbiorach i relacjach (suma, różnica, przecięcie, złożenie), po problemy związane
Obliczenie potęgi k znormalizowanej afinicznej relacji 19 z generowaniem kodu dla obliczonych zbiorów z ograniczeniami nieliniowymi. O ile w przypadku pętli, w których występuje tylko jedna relacja zależności (takiej sytuacji poświęciliśmy bieżący artykuł) możliwe jest znajdowanie optymalnych harmonogramów swobodnych (choć nie bez problemów, operacje na relacjach i zbiorach oraz generowanie kodu było wykonywane ręcznie) o tyle w przypadku pętli, w których występuje więcej niż jedna relacja zależności nie zawsze jest możliwe. Problemy te staną się kolejnymi z którymi postaramy się zmierzyć w następnych badaniach. Bibliografia [1] Darte A., Robert Y., Vivien F. Scheduling and Automatic Parallelization. Birkhauser Boston, 2000 [2] Pugh W., Wonnacot D. An Exact Method for Analysis of Value-based Array Data Dependences. Workshop on Languages and Compilers for Parallel Computing, 1993 [3] Kelly W., Pugh W., Rosser E., Shpeisman T. Transitive clousure of infinite graphs and its applications, Languages and Compilers for Parallel Computing, 1995 [4] Feautrier P. Some Efficient Solutions to the Affine Scheduling Problem, Part I. One-Dimensional Time. International Journal of Parallel Programing, Vol 21(5), 1992 [5] Feautrier P. Some Efficient Solution to the Affine Scheduling Problem, Part II, Multi-Dimensional Time. International Journal of Parallel Programing, Vol. 21(6), 1992 [6] Kelly W., Maslov V., Pugh W., Rosser E., Shpeisman T., Wonnacott D. The Omega library interface guide. Technical Report CS-TR-3445, Dept. of Computer Science, University of Maryland, College Park, March 1995 [7] Wolf M. E., Lam M. S. A Loop Transformation Theory and an Algorithm to Maximize Parallelism. IEEE Transactions on Parallel and Distributed Systems, Vol. 2(4), 1992 [8] Bielecki W., Drążkowski R. Approach to building free schedules for loops with affine dependences represented with a single dependence relation. WSEAS Transactions on Computers, Issue 11, Volume 4, 2005 [9] Bielecki W., Siedlecki K. Finding Free Schedules for Non-uniform Loops. Proceedings of the Euro-Par 2003, Lecture Notes in Computer Science, 2003 [10] Bielecki W., Siedlecki K. Wyszukiwanie równoległości nie wymagającej synchronizacji w pętlach idealnie zagnieżdżonych. X Sesja Naukowa Wydziału Informatyki Politechniki Szczecińskiej, Szczecin 2005 [11] Bielecki W., Siedlecki K. Wyszukiwanie początków niezależnych wątków obliczeń w dowolnie zagnieżdżonych pętlach programowych. Metody Informatyki Stosowanej w Technice i Technologii, Szczecin 2004 [12] Kelly W., Pugh W. Minimizing communication while preserving parallelism. ACM International Conference on Supercomputing, 1996, s. 52-60 [13] Pugh W., Rosser E. Iteration Space Slicing and its Application to Communication Optimization. Proceedings of International Conference on Supercomputing, 1997 [14] Lim W., Lam M. S. Communication-free parallelization via affine transformations. Proceedings of the seventh workshop on languages and compilers for parallel computing, 1994, s. 92-106