Zadanie zaliczeniowe z MPI (2014)

Z powodu kłopotów z klastrem notos wystarczy przetestować 15 konfiguracji z e-mail'a.

Tematem zadania zaliczeniowego z MPI w tym roku jest efektywny równoległy program rozwiązujący problem tzw. maksymalnej podtablicy (ang. the maximum subarray problem) z tym że w dwóch wymiarach. Problem taki pojawia się w grafice komputerowej czy w eksploracji danych. Naiwny algorytm sekwencyjny rozwiązujący ten problem można znaleźć w programie msp-seq-naive.c (do pobrania tutaj). Zaprojektuj efektywny równoległy algorytm i zaimplementuj go w postaci programu w MPI. Przeprowadź eksperymenty ze swoim rozwiązaniem na klastrze notos ICM. W szczególności, policz speed-up'y dla różnych rozmiarów tablic (M x N) i liczby procesów (P). Zaprezentuj rozwiązanie i wyniki w formie raportu.


Spis treści

  1. Problem
  2. Szczegółowe wymagania
  3. Kryteria oceniania
  4. FAQ

Problem

Dana jest dwuwymiarowa tablica liczb całkowitych o M wierszach i N kolumnach (A : array [1..M, 1..N] of integer). Zadaniem jest znalezienie takich i, j, k oraz l, gdzie 1 ≤ ikM oraz 1 ≤ jlN, że suma elementów w podtablicy A[i..k, j..l], to jest, S[i..k,j..l], jest maksymalna. Innymi słowy, że dla dowolnych i', j', k' oraz l' takich, że 1 ≤ i'k'M oraz 1 ≤ j'l'N, mamy S[i..k,j..l]S[i'..k',j'..l']. Przykładowo, dla poniższej tablicy A[1..4, 1..8]:

-1 2-3 5-4-8 3-3
2-4-6-8 2-5 4 1
3-2 9-9 3 6-5 2
1-3 5-7 8-2 2-6

szukana podtablica to zaznaczone kolorem szarym A[3..4, 5..6], ponieważ S[3..4, 5..6] = 15 jest maksymalne.

W przypadku, gdy tablica ma wiele podtablic maksymalnych, wystarczy znaleźć dowolną z nich.

Implementacja bardzo sekwencyjnego algorytmu znajduje się w załączonym pliku msp-seq-naive.c. Zaprojektuj efektywny algorytm równoległy i zaimplementuj go w postaci programu używającego MPI a także przetestuj jego poprawność i wydajność. Dla ułatwienia, poniżej znajdują się trzy pozycje literatury, od których warto zacząć prace nad rozwiązaniem:

  1. Bentley, J.: “Programming Pearls - Algorithm Design Techniques,” Communications of the ACM, vol. 27, no. 9, September 1984, pp. 865-871.
  2. Tamaki, H. and Tokuyama, T.: “Algorithms for the maximum subarray problem based on matrix multiplication,” in SODA '98: Proceedings of the Ninth Annual ACM-SIAM Symposium on Discrete Algorithms, Society for Industrial and Applied Mathematics, Philadelphia, PA, USA, January 1998, pp. 446-452.
  3. Takaoka, T.: “Efficient Algorithms for the Maximum Subarray Problem by Distance Matrix Multiplication,” Electronic Notes in Theoretical Computer Science, vol. 61, January 2002, pp. 191-200.

Szczegółowe wymagania

Struktura rozwiązania

Rozwiązanie powinno składać się z co najmniej następujących plików:

report.pdf
Państwa raport.
Makefile
Plik makefile kompilujący Państwa program równoległy do msp-par.exe. Nie można istotnie zmieniać kompilacji plików (np. usuwając nasze reguły bądź zmienne).
msp-seq-naive.c
Oryginalny sekwencyjny program implementujący algorytm naiwny. Pliku tego nie wolno zmieniać za wyjątkiem imienia, nazwiska i numeru indeksu w wypisywanym komunikacie.
msp-par.c
Państwa wersja programu równoległego.
msp-par.ll
Specyfikacja zadania dla M = 103 i N = 103 przy 32 procesach (4 procesy na maszynę). Nazwa zadania to MSP_<login>_1000x1000, zaś pliki standardowego wyjścia i wyjścia diagnostycznego to odpowiednio MSP_<login>_1000x1000.out i MSP_<login>_1000x1000.err.
matgen.h
Plik zawierający funkcje nagłówkowe i struktury do inicjalizacji tablicy. Pliku tego nie wolno zmieniać.
matgen-mt.c
Plik implementujący funkcje do inicjalizacji tablicy. Pliku tego nie wolno zmieniać. Jednakże, podczas testowania możemy automatycznie podmieniać ten plik (przed kompilacją).

Uwaga: Nie wolno używać bibliotek czy plików nagłówkowych, które nie są zainstalowane na klastrze notos ICM.

Program

Państwa rozwiązanie, msp-par.exe, musi przyjmować dokładnie te same argumenty co sekwencyjne rozwiązanie naiwne, msp-seq-naive.exe. Podobnie, wyniki działania i komunikaty muszą być wypisywane identycznie, jak w rozwiązaniu sekwencyjnym — niezależnie od tego w ilu procesach program równoległy zostanie uruchomiony. Jedyne co należy zmienić zarówno w programie sekwencyjnym, jak i równoległym to wstawić w wypisywanym komunikacie Państa imię, nazwisko i numer indeksu (zamiast Jana Kowalskiego).

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ą znacznie karane (patrz niżej).

Testowanie

Mierzenie czasu wykonania powinno pozostać niezmienione. Innymi słowy, pomiar czasu w algorytmie równoległym nie powinien uwzględniać czasu generowania/rozsyłania do wszystkich procesów tablicy wejściowej.

Dla ułatwienia i odciążenia klastra, jako bazę sekwencyjną, względem której liczone są speed-up'y należy użyć średnich wyników z naszych (niezbyt zoptymalizowanych) programów sekwencyjnych (dostępnych tutaj). Podczas raportowania czasów wykonania proszę podać średnią, minimum i maksimum z co najmniej trzech wykonań każdej konfiguracji. Speed-up'y liczymy jedynie wg średniej. Jeśli Państwa implementacja równoległa osiąga lepsze wyniki w konfiguracji jednoprocesowej niż nasze wyniki, to w raporcie speed-up'y powinny być liczone względem dwóch baz wyników: naszych i otrzymanych przez Państwa równoległą implementację w konfiguracji jednoprocesowej.

Testowanie powinno odbywać się na klastrze notos. Eksperymenty powinny uwzględniać od 1 do 16 węzłów oraz od 1 do 4 procesów na węzeł. Im bardziej przekonujące testy skalowalności — więcej maszyn, większe dane, większa liczba konfiguracji, itd. — tym lepsza ocena.

Raport

Raport powinien zawierać:

  1. Opis rozwiązania.
  2. Testy i ich wyniki.

Opis rozwiązania powinien uwzględniać zarys pomysłu, jak również dokładny opis algorytmu, to jest założenia, struktury danych, podział zadań na procesy, 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. Rozdział o testach powinien zawierać:

Wyniki powinny być prezentowane jako tabele oraz wykresy, stąd wymaganie o formacie raportu (PDF).


Kryteria oceniania

Celem zadania jest zachęcenie Państwa do zabawy i eksperymentów z MPI. Dlatego też istotną częścią rozwiązania będzie raport (koniecznie w formacie PDF). Dokładniej, punkty rozkładają się następująco:

Jeśli program będzie działał niepoprawnie w naszych testach, będziemy odejmować do 7 pkt. (a w przypadkach skrajnych — do 10 pkt.).

Z zrównoleglenie algorytmu naiwnego można otrzymać maksymalnie 2 punkty (plus do 2 punktów za raport).

Za każde rozpoczęte 12 godzin spóźnienia odejmujemy 1 punkt.


FAQ

Wszelkie pytania proszę kierować do Konrada Iwanickiego.

Czy można założyć, że cała tablica A mieści się w pamięci pojedynczego procesu?
Tak.
Czy można założyć, że liczba procesów P jest potęgą dwójki?
Tak. Jednakże, jeśli program zostanie uruchomiony z P nie będącym potęgą dwójki to powinien nadal działać poprawnie, lecz na przykład przyjmując za P maksymalną potęgę dwójki mniejszą od oryginalnego P. Innymi słowy, pozostałe procesy mogą być bezczynne w takim przypadku.
Czy można założyć, że liczba procesów PN x M?
Tak. Uwaga jak wyżej.
Czy można założyć, że tablica jest kwadratowa (tj. N = M)?
Nie.
Czy można założyć, że N i/lub M jest potęgą dwójki?
Nie.
Czy można pisać w C++?
Tak, pod warunkiem, że nazewnictwo plików będzie zachowane oraz programy będą się kompilować na naszym klastrze ICM.
Czy dopuszczamy możliwość użycia OpenMP lub Cilk, gdy wiele procesów działa na tym samym węźle?
Nie.
Czy można założyć, że funkcje generujące dane będą deterministyczne? Innymi słowy, czy można nie rozsyłać danych tylko generować je lokalnie w każdym procesie?
Tak, pod warunkiem, że każdy proces będzie generował je tak samo (co do kolejności wołania instrukcji i ich parametrów).
Co można założyć o zakresie liczb będących elementami tablicy?
Mieszczą się w 32 bitach. Poza tym nic.
Co można założyć o wielkości samej tablicy?
Mieści się w pamięci węzła, ewentualnie pamięci węzła podzielonej przez liczbę rdzeni w przypadku uruchamiania wielu procesów na węźle (powiedzmy pomnożona przez rozsądną stałą, jeśli to konieczne).

Ostatnia modyfikacja: 10/05/2014