Algorytm Floyda-Warshalla oblicza najkrótsze ścieżki pomiędzy wszystkimi N2 parami wierzchołków w grafie o N wierzchołkach. Program na maszyny jednoprocesorowe implementujący ten algorytm można znaleźć w pliku floyd-warshall-seq.c (do pobrania tutaj). Napisz równoległą wersję tego programu w MPI. Zastanów się jak podzielić zadania pomiędzy procesy oraz jak każdy z procesów ma obliczać swoje zadania. Podobnie zastanów się, jak zbierać wyniki do wypisania na ekran. Policz speed-up'y dla różnych wielkości grafów i liczby dostępnych procesorów. Zaprezentuj rozwiązanie i wyniki w formie raportu.
Uwaga dla leniwych: Zadania nie da się zrobić w ostatniej chwili.
Celem zadania jest zachęcenie Państwa do zabawy i eksperymentów z MPI. Dlatego też najważniejszą częścią rozwiązania będzie raport (koniecznie w formacie PDF, patrz niżej). Brak raportu (lub kiepski, na przykład, pisany w ostatniej chwili) oznacza zero punktów za zadanie. Program będzie potrzebny jedynie do zweryfikowania wydajności rozwiązania, sprawdzenia, czy rozwiązanie nie zawiera istotnych błędów (np. blokad) oraz czy informacje zawarte w raporcie są zgodne z rzeczywistością.
Zakładając, że raport jest w miarę sensowny, nadesłane rozwiązania będą oceniane pod względem efektywności: rozwiązania, które osiągną speed-up najbardziej zbliżony do liniowego będą oceniane najwyżej. Dlatego też bardzo ważne jest zastosowanie się do poniższych wymagań dotyczących testowania oraz struktury programu.
Kara za spóźnienie rośnie wykładniczo (przy czym "dosłanie poprawki lub jednej brakującej rzeczy" jest traktowane jako spóźnienie):
Rozwiązanie powinno składać się z 4 plików:
Państwa rozwiązanie, floyd-warshall-par.exe, musi przyjmować dokładnie te same argumenty co rozwiązanie sekwencyjne, floyd-warshall-seq.exe, oraz musi identycznie wspierać flagi preprocesora USE_RANDOM_GRAPH i USE_RANDOM_SEED. Podobnie, wyniki działania i wypisywane komunikaty muszą być identyczne, jak w rozwiązaniu sekwencyjnym — niezależnie od tego na ilu procesorach program równoległy zostanie uruchomiony.
Uwaga: Rozwiązania będą automatycznie testowane. Wobec tego programy, które będą nieprawidłowe lub będą nieprawidłowo wypisywać wyniki będą automatycznie odrzucane bez dalszego sprawdzania.
Implementację algorytmu, jak i struktury danych do przechowywania grafu można dowolnie modyfikować (oczywiście pod warunkiem, że Państwa rozwiązanie pozostanie implementacją algorytmu Floyda-Warshalla). Mierzenie czasu wykonania do obliczania speed-up'ów powinno jednak pozostać nie zmienione. Innymi słowy, pomiar czasu w algorytmie równoległym nie musi uwzględniać czasu rozsyłania inicjalnego grafu do wszystkich procesorów, ani ewentualnego zbierania wyników. Jeśli Państwa implementacja algorytmu Floyd-Warshall'a osiągna inne wyniki na jednym procesorze niż dostarczona implementacja sekwencyjna, to w raporcie speed-up'y powinny być liczone względem dwóch implementacji: wzorcowej sekwencyjnej i Państwa równoległej na jednym procesorze.
Niestety, jeszcze nie dorobiliśmy się klastra na wydziale. Dlatego też testowanie powinno odbywać się na maszynach w sali, w której macie Państwo laboratorium z PWIR (w raporcie należy wymienić maszyny, na których rozwiązanie było testowane). Eksperymenty powinny uwzględniać od 1 do przynajmniej 4 (a najlepiej 8) maszyn. Ponieważ maszyny w niektórych labach są wielordzeniowe, oprócz testowania wydajności jednej instancji programu per maszyna, należy przetestować również wiele instancji (do liczby rdzeni). Minimalne wymaganie co do maksymalnej konfiguracji na komputerach wielordzeniowych to 4 maszyny po dwa procesy na maszynę. Wielkości grafu, na których rozwiązanie będzie testowane powinny być sensownie wybrane z przedziału od 1 do 5000 węzłów. Oczywiście można testować też większe grafy, ale nie należy przesadzać, żeby nie zabierać kolegom czasu maszyn.
Podczas raportowania czasów wykonania proszę podać minimalny, średni i maksymalny speed-up, który udało się osiągnąć. Można odrzucić wyniki wykonań, w których ktoś wykonywał coś innego na jednej z maszyn podczas testowania naszego programu (niestety, nie mamy dedykowanego klastra, więc najlepiej testy robić w nocy).
Raport powinien zawierać:
Opis rozwiązania powinien uwzględniać generalny pomysł, założenia, struktury danych, podział zadań na procesory, komunikację, optymalizacje, itp. Powinien być on opatrzony rysunkami tam gdzie one pomagają zrozumieć Państwa pomysły.
Jeśli chodzi o testy, to powinny być ich dwie grupy: poprawnościowe i wydajnościowe. Jeśli chodzi o pierwszą grupę, to wystarczy krótka notka. Druga grupa natomiast musi być dokładnie opisana.
Rozdział o testach powinien zawierać:
Wyniki powinny być prezentowane jako tabele oraz wykresy, stąd wymaganie o formacie raportu (PDF).
Wszelkie pytania proszę kierować do Konrada Iwanickiego.
Ostatnia modyfikacja: 07/06/2011