WRÓBEL Magdalena 1 NOZDRZYKOWSKI Łukasz 2 Metody zrównoleglania algorytmów wyznaczania najkrótszej drogi w transporcie morskim WSTĘP Celem nawigacji morskiej, jako złożonego systemu analizy dużej ilości danych, jest stworzenie warunków bezpiecznej żeglugi pomiędzy portami przy minimalizacji kosztów podróży. Korzystając z systemów nawigacyjnych, w których skład wchodzą takie elementy jak ARPA, AIS, czy systemy obrazowania map elektronicznych ECDIS, możliwe było opracowanie koncepcji zintegrowanego mostka nawigacyjnego. Jednym z najważniejszych zadań procesu nawigacyjnego jest planowanie trasy statku pomiędzy portem początkowym, a końcowym z uwzględnieniem portów pośrednich. Proces ten polega na wykorzystaniu danych na temat istniejących ograniczeń nawigacyjnych (lądy, tory wodne, płycizny) w celu wyznaczenia punktów zwrotu (waypoint) marszruty statku [1]. Bliskim zagadnieniem jest problem unikania kolizji na morzu polegający na wyznaczaniu trajektorii statku z optymalizacją kosztów odchyleń od trajektorii zadanej, zwłaszcza od trajektorii określanej poprzez najkrótszą drogę, przy czym w procesie tym należy spełniać warunki bezpieczeństwa drogi. Należą do nich widzialność, zdolność manewrowa, warunki pogodowe czy rejon żeglugi, a także same charakterystyki statków [2, 3]. W obecnych czasach procesom nawigacyjnym nieodłącznie towarzyszą systemy informatyczne. Dotyczy to także systemów wyznaczania drogi, które w rzeczywistości operują na grafach i poszukiwaniu w nich najkrótszej ścieżki (drogi). Komputery i systemy informatyczne usprawniają i automatyzują procesy pozyskiwania, przetwarzania i analizowania informacji [4]. Niestety, coraz większe ilości informacji, jakie należy przetworzyć, wymagają zaangażowania coraz większych mocy obliczeniowych. Z pomocą przychodzi koncepcja systemów przetwarzania równoległego i rozproszonego, które pozwalają na znaczne przyspieszenie obliczeń. Aplikacje komputerowe pisane dotychczas w formie sekwencyjnych operacji są teraz zrównoleglone w celu skrócenia czasu wykonywania zadań. W artykule przedstawione zostaną sposoby zrównoleglenia wybranych algorytmów poszukiwania najkrótszej ścieżki w grafie, które stosowane są w nawigacji do wyznaczania marszruty statku. 1 ALGORYTMY POSZUKIWANIA NAJKRÓTSZEJ ŚCIEŻKI W GRAFACH W niniejszej pracy zaproponowano możliwość przyspieszenia działania algorytmów znajdowania najkrótszej ścieżki w grafach przy pomocy programowania równoległego. Poprzez przystosowanie implementacji algorytmów najkrótszej drogi do działania na wielu rdzeniach procesora możliwe staje się szybsze przeszukiwanie grafu. Ogólnie problem najkrótszej ścieżki definiuje się dla grafu G(N,A), o n= N węzłach oraz m= A krawędziach [5]. Każde połączenie (i,j) należące do A posiada swój koszt c i,j reprezentujący czas podróżny daną krawędzią. Ścieżką P z punktu O do celu D jest serią połączonych krawędziami wierzchołków, a czas całkowity podróży jest sumą wszystkich czasów (wag) każdej z krawędzi należących do danej ścieżki P. Problem najkrótszej ścieżki ma za zadanie w grafie ważonym wyszukać połączenie pomiędzy wierzchołkami o najmniejszej sumie czasów (wag). Oznaczając 1 mgr inż. M. Wróbel, asystent, Instytut Technologii Morskich, Wydział Nawigacyjny, Akademia Morska w Szczecinie, ul. Wały Chrobrego 1-2, 70-500 Szczecin, (+4891)48-09-566, m.wrobel@am.szczecin.pl 2 dr inż. Ł. Nozdrzykowski, adiunkt, Instytut Technologii Morskich, Wydział Nawigacyjny, Akademia Morska w Szczecinie, ul. Wały Chrobrego 1-2, 70-500 Szczecin, (+4891)48-09-566, l.nozdrzykowski@am.szczecin.pl 11386
najkrótszy dystans z węzła i do D jako d i (minimalny czas podróży) należy sprawdzić dla każdego węzła i[5]: (1) Szczególnym przypadkiem jest problem najkrótszej ścieżki od jednego wierzchołka do wszystkich pozostałych oraz problem najkrótszej ścieżki pomiędzy wszystkimi parami wierzchołków. W niniejszym artykule wykonano próbę zrównoleglenia algorytmów Dijkstry, Floyda-Warschalla oraz Prima przy pomocy standardu zrównoleglenia OpenMP [6]. 2 SPOSÓB ZRÓWNOLEGLENIA ALGORYTMU DIJKSTRA Algorytm Dijkstra jest algorytmem ze sprzężeniem zwrotnym, gdzie krok następny jest determinowany przez krok poprzedni. Wyjątkiem jest oczywiście wybierany krok pierwszy oznaczony jako punkt startowy. Z tego powodu niemożliwe staje się zrównoglenie tego algorytmu przy pomocy prostych instrukcji zrównoleglających, jak chociażby #pragmaomp for. Algorytm ten pozwala jedynie na zrównoleglenie procesu wyszukiwania najkrótszej drogi z najniższą wagą. W celu zrównoleglenia algorytmu Dijkstry proponuje się początkowo w sekcji równoległej #pragmaompparallel wykonać inicjalizację danych (listing 1). intistartobliczen, ikoniecobliczen, iwierzcholek, iminwatka, inrwatkamin, m, iwatek =omp_get_thread_num(); #pragma omp single ile_watkow = omp_get_num_threads(); iporcjadanych = ROZMGRAFU / ile_watkow; istartobliczen = iwatek * iporcjadanych; ikoniecobliczen = istartobliczen + iporcjadanych - 1; Listing 1 Inicjalizacja zmiennych oraz podział zadań pomiędzy wątkami Poprzez tą operację każdy wątek wykonuje operacje na własnych danych w sposób niezależny. Wątek główny ma tu za zadanie dokonać podziału zadania na równe części pomiędzy wszystkie wątki. Wszystkie wątki następnie wyznaczają swój zakres obliczeń. Całościowy proces wyszukiwania najkrótszej drogi odbywa się w pętli iterującej po wszystkich węzłach (listing 2). for (iwierzcholek = 0; iwierzcholek< ROZMGRAFU; iwierzcholek++) Listing 2Przejście po wszystkich wierzchołkach grafu W pierwszej fazie pętli konieczne jest przeprowadzenie inicjalizacji danych początkowych (listing 3). Operację tą powinien wykonać jeden z wątków, którym domyślnie jest wątek główny. #pragmaomp single iminwatkow = NIESKONCZONOSC; inrwierzcholka = 0; Listing 3Inicjalizacja doanych początkowych przez wątek główny W celu wymuszenia wykonania operacji przez wątek główny zastosowano pragmę Single standardu OpenMP. iminwatka = NIESKONCZONOSC; for (i = istartobliczen; i <= ikoniecobliczen; i++) if (iodwiedzone[i] &&iminodleglosc[i] <iminwatka) iminwatka = iminodleglosc[i]; inrwatkamin = i; Listing 4 Poszukiwanie minimum przez wybrany wątek 11387
Kolejnym krokiem (listing 4) algorytmu wykonywanym w pętli każdego wątku jest wyszukiwanie najkrótszej drogi do kolejnego nieodwiedzonego węzła. W tym miejscu każdy z wątków operuje na zakresie danych wyznaczonym na listingu 1. #pragmaompcritical if (iminwatka<iminwatkow) iminwatkow = iminwatka; inrwierzcholka = inrwatkamin; Listing 5 Agregacja danych obliczonych przez wszystkie wątki. W następnej fazie (listing 5) wykonana zostaje agregacja danych w celu wyznaczenie najniższej wartości wyliczonej w operacjach wykonywanych przez wątki. Obszar ten oznaczony został jako krytyczny i powinien zostać wykonany przez jeden wątek. Po tej operacji możliwe staje się zapisanie najkrótszej ścieżki dotąd odwiedzonej (listing 6). for (i = istartobliczen; i <= ikoniecobliczen; i++) if(iminodleglosc[inrwierzcholka] + iwektrododleglosci[inrwierzcholka * ROZMGRAFU + i] <iminodleglosc[i]) iminodleglosc[i] = iminodleglosc[inrwierzcholka] + iwektrododleglosci[inrwierzcholka * ROZMGRAFU + i]; Listing 6 Wyliczenie minimalnej ścieżki grafu 7). Końcowym zadaniem jest oznaczenie odwiedzonego węzła oraz wykonanie synchronizacji (listing #pragmaomp single iodwiedzone[inrwierzcholka] = 0; #pragma omp barrier Listing 7 Oznaczenie węzła jako odwiedzony oraz wywołanie bariery. Poprzez ustawienie bariery zapobiega się występowania wyścigu wątków. 3 ZRÓWNOLEGLENIE ALGORYTMU PRIMA Algorytm Prima wykonywany jest w pętli, w której nie występuje zależność pomiędzy iteracjami. Z tego powodu jest on łatwiejszy do zrównoleglenia. Jego sposób przedstawiono w całości na listingu 8. 11388
while (wierzcholki!= iliczbawierz) #pragmaompparallel for private(iindexwierz) for (iindexwierz = 0; iindexwierz<iliczbawierz; iindexwierz++) if (igraf[wiersz][iindexwierz]!= 0) if (iodwiedzone[iindexwierz] == 0) if (iwaga[iindexwierz]>igraf[wiersz][iindexwierz]) #pragmaompcritical iwaga[iindexwierz] = igraf[wiersz][iindexwierz]; ikosztdrogi = MX; for (iindexwierz = 0; iindexwierz<iliczbawierz; iindexwierz++) if (iodwiedzone[iindexwierz] == 0) if (iwaga[iindexwierz] <ikosztdrogi) ikosztdrogi = iwaga[iindexwierz]; wiersz = iindexwierz; iodwiedzone[wiersz] = 1; wierzcholki++; ikosztdrogi = 0; for (iindexwierz = 0; iindexwierz<iliczbawierz; iindexwierz++) ikosztdrogi += iwaga[iindexwierz]; Listing 8 Zrównoleglony algorytm Prima Do zrównoleglenia należy zastosować zrównoleglenie pętli for z domyślną zmienną prywatną iindexwiersz poprzez instrukcję #pragmaompparallel for private(iindexwiersz), która rozbija poszukiwanie poszczególnych ścieżek w grafie na osobne wątki. Ponieważ wewnątrz pętli odbywa się sprawdzanie wyboru najkrótszej ścieżki, stąd też wymagane jest wydzielenie sekcji krytycznej dla jej zapisania. 4 ZRÓWNOLEGLENIE ALGORYTMU FLOYDA-WARSCHALLA Algorytm Floyda-Warschalla jako sposób na przeszukiwanie fragmentów grafu pomiędzy dwoma wierzchołkami cechuje się prostą konstrukcją, gdzie pętle podobnie jak w algorytmie Prima nie posiadają zależności pomiędzy instrukcjami. W całości algorytm ten przedstawia listing 9. for (iindexk = 0; iindexk<rozmgrafu; iindexk++) #pragma omp parallel for shared(a) for (iindexi = 0; iindexi<rozmgrafu; iindexi++) for (iindexj = 0; iindexj<rozmgrafu; iindexj++) igraf[iindexi][iindexj] = minimum(igraf[iindexi][iindexj], igraf[iindexi][iindexk] + igraf[iindexk][iindexj]); Listing 9 Zrównoleglony algorytm Floyda-Warschalla Do jego zrównoleglenia wystarcza pojedyncza instrukcja zrównoleglenia pętli for z przekazaniem tablicy wag wierzchołków w sposób dzielony pomiędzy wątki. 11389
5 TESTY EFEKTYWNOŚCI PROPONOWANYCH ROZWIĄZAŃ Testy efektywności zrównoleglonych algorytmów poszukiwania najkrótszej ścieżki w grafach wykonano na komputerze z procesorem ośmiowątkowym Intel Core i7-720qm, 4GB pamięci RAM, system operacyjny Windows 7 64 bit. 5.1 Algorytm Dijkstra Algorytm przetestowano dla różnych rozmiarów danych wejściowych. Graf posiadał odpowiednio 10000, 60000 oraz 100000 wierzchołków. Na rys. 1 przedstawiono wyniki z poszczególnych testów. Dijkstra 10000 wierzchołków Dijkstra 60000 wierzchołków 5 4 3 2 1 0 4.09 1.99 1.08 0.51 35 30 25 20 15 10 5 0 29.96 14.04 8.00 4.08 Dijkstra 100000 wierzchołków 100 80 60 40 20 0 80.30 38.29 19.60 10.21 Rys. 1 Wyniki testów zrównoleglonego algorytmu Dijkstra dla różnej wielkości danych oraz różnej liczby procesorów. Na rysunku 1 przedstawiono wykresy z wynikami dla różnych wielkości danych. We wszystkich przypadkach wraz ze wzrostem liczby wątków użytych do obliczeń maleje czas wykonania się algorytmu. Przyspieszenie dla poszczególnych wielkości danych oraz liczby procesorów przedstawia tabela 1. Tab. 1. Uzyskane przyspieszenie algorytmu Dijkstra Rozmiar danych 10000 60000 100000 2 2,05 2,13 2,09 4 3,78 3,74 4,09 8 7,98 7,34 7,86 Dane w tab. 1 pokazują, że w wyniku zrównoleglenia algorytmu Dijkstry osiągnięto przyspieszenie liniowe. 11390
5.2 Algorytm Prima Algorytm Prima przetestowano dla następujących rozmiarów grafu, który posiadał odpowiednio 8000, 9000 oraz 10000 wierzchołków. Na rys. 2 przedstawiono wyniki z poszczególnych testów. Prim 8000 wierzchołków Prim 9000 wierchołków 0.95 0.85 0.75 0.65 0.55 0.91 0.69 0.59 0.61 1.25 1.15 1.05 0.95 0.85 0.75 0.65 0.55 1.16 0.86 0.73 0.63 Prim 10000 wierzchołków 1.6 1.4 1.2 1 0.8 0.6 1.41 1.03 0.89 0.80 Rys. 2 Wyniki testów zrównoleglonego algorytmu Prima dla różnej wielkości danych oraz różnej liczby procesorów. Na rys. 2 przedstawiono czasy wykonania się algorytmu Prima dla poszczególnych wielkości danych oraz liczby wątków. Na wykresie dla grafu posiadającego 8000 wierzchołków widać, że zwiększenie liczby wątków z 4 na 8 nie przyniosło znaczącego skrócenia czasu obliczeń. Spowodowane jest to domyślną barierą dla każdej iteracji pętli for jaką ustawia OpenMP. Na pozostałych wykresach czas maleje przy wykorzystaniu większej liczby wątków. Przyspieszenie dla poszczególnych wielkości danych oraz liczby procesorów przedstawia tabela 2. Tab. 2. Uzyskane przyspieszenie algorytmu Prima Rozmiar danych 8000 9000 10000 2 1,32 1,35 1,36 4 1,53 1,58 1,57 8 1,49 1,85 1,76 5.3 Algorytm Floyda-Warschalla Testy algorytmu Floyda-Warschalla wykonano dla następujących rozmiarów grafu 1000, 1500, 2000 węzłów. Zmierzony czas wykonania się algorytmu przedstawia rys. 3. 11391
Floyd-Warshall 1000 Floyd-Warshall 1500 38 33 28 23 18 32.98 21.20 19.38 18.85 123 113 103 93 83 73 63 111.57 96.75 73.26 64.58 280 260 240 220 200 180 160 263.95 Rys. 3 Wyniki testów zrównoleglonego algorytmu Floyda-Warschalla dla różnej wielkości danych oraz różnej liczby procesorów. Na rys. 3 zaprezentowano czasy wykonania algorytmu Floyda-Warschalla dla poszczególnych wielkości danych oraz liczby wątków. Przyspieszenie dla poszczególnych wielkości danych oraz liczby procesorów przedstawia tabela 3. Tab. 3. Uzyskane przyspieszenie algorytmu Floyda-Warschalla Rozmiar danych 1000 1500 2000 2 1,55 1,15 1,32 4 1,70 1,52 1,50 8 1,75 1,72 1,57 Podobnie jak dla algorytmu Prima, tak i dla algorytmu Floyda-Warschalla efektywność zrównoleglenia jest na zbliżonym poziomie. Spowodowane to jest tym samym sposobem przyjętego zrównoleglenia obydwu tych algorytmów. W związku z tym stwierdza się, że wzrastająca liczba wątków obliczeniowych nie wpływa znacząco na przyspieszenie obliczeń. WNIOSKI Floyd-Warshall 2000 199.47 175.36 167.25 W artykule zostały przedstawione metody zrównoleglania trzech algorytmów znajdowania najkrótszej ścieżki w grafie. Były to algorytmy Dijsktra, Prima oraz Floyda-Warschalla. Poprzez zastosowanie odpowiednio dobranych pragm standardu programowania równoległego OpenMP udało się uzyskać przyspieszenie działania algorytmów na poziomie: algorytm Dijkstra 7,34; algorytm Prima 1,49 oraz algorytm Floyda-Warschalla 1,57. Przyspieszenie obliczeń dotyczących algorytmów znajdowania najkrótszej ścieżki w grafie staje się szczególnie istotne z punktu widzenia ich realizacji w ramach systemów komputerowych, w tym systemów operujących w transporcie morskim. Umożliwia to przyspieszenie rozwiązywania 11392
problemów poszukiwania optymalnej marszruty statku na morzu z uwzględnieniem coraz większej ilości danych dodatkowych, w tym ograniczeniach akwenów, gdzie obliczenia są wykonywane nie przez jeden rdzeń, a wiele rdzeni współczesnych komputerów. Streszczenie W artykule przedstawiono sposób przyspieszania działania wybranych algorytmów wyszukiwania najkrótszej ścieżki w grafie poprzez wykorzystanie programowania równoległego w systemach komputerowych. Przedstawiono metodę zrównoleglenia algorytmów Dijkstra, Prima oraz Floyda-Warshalla przy pomocy instrukcji standardu programowania równoległego OpenMP. W artykule tym przedstawiono tzw. pragmyopenmp służące do zachowania poprawności działania algorytmu w środowisku równoległym Przedstawione algorytmy stanowią podstawę metod planowania drogi w transporcie, w tym w transporcie morskim do wyznaczania optymalnej trasy statku z uwzględnieniem danych o lokalizacji portów pośrednich i ograniczeń nawigacyjnych. Przedstawiono także testy efektywności zrównoleglenia proponowanych rozwiązań dla różnych wielkości grafów do przeszukania oraz różnej liczby wątków sprzętowych biorących udział w obliczeniach. Methods of parallelization a shortest path algorithms for maritime transport Abstract In article presents a method to accelerating a operation of selected algorithms of searching the shortest path in graph by using the parallel programming in computer systems. Presents a method of parallelization Dijkstra's, Prim's and Floyd Warshall algorithms with using the instructions of OpenMP parallel programming standard. This article presents the specific pragmas of OpenMPused to preservation the proper operation of the algorithm in a parallel environment. These algorithms are the basis of methods of route in the transport, including maritime transport to determine the optimal route of the vessel including the information about ports and navigation restrictions. This paper also presents a tests of parallelization efficiency of the proposed solutions for different sizes of graphs to be searched and the different number of hardware threads involved to the calculation. BIBLIOGRAFIA 1. Lazarowska Agnieszka, Planowanie trasy przejścia statku z zastosowaniem algorytmu mrówkowego, Zeszyty naukowe Akademii Morskiej w Gdyni, nr 78, marzec 2013 2. Smierzchalski Roman, Nawigacyjny problem unikania kolizji na morzu jako adaptacyjne modelowanie trajektorii statku, Proceedings of the 2nd National Conference on Evolutionary Computation and Global Optimization, Rytro, Poland, Warsaw University of Technology Publishing House, pp. 253-260, 1997 3. Wiśniewski Bernad, Ships ocean route programming, Zeszyty Naukowe Akademia Morska w Szczecinie, 2012, 29 (101) 4. Pietrzykowski Z., Nozdrzykowski Ł., Wróbel M., Koncepcja udostępniania usług w chmurze obliczeniowej w transporcie morskim, Logistyka 2/2014 5. Jincheng Jiang, Lixin Wu, A Dynamic Navigation Algorith Considering Network Disruptions, The International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences, Volume XL-4, 2014 6. Standard OpenMPwww.openmp.org [dostęp 09.2014] 11393