Analiza i modelowanie wydajności obliczeń Lab 11. Studium skalowalności
Cel: Opanowanie techniki określania skalowalności w sensie silnym i w sensie słabym Kroki:
1. W celu rozszerzonego badania skalowalności algorytmu i programu mnożenia macierz-macierz dla pojedynczego węzła obliczeniowego, dokonaj studium zależności skalowalności w sensie silnym od rozmiaru zadania
2. W nowym katalogu np. lab_10/mat_mul uruchom program mnożenia macierz-macierz opracowany w ramach poprzedniego laboratorium. Przyjmij parametry w pliku sizes.h : BLOCK_SIZE_S 96, BLOCK_SIZE_L (BLOCK_SIZE_S), ALIGNMENT 64
3. Przeprowadź badanie skalowalności w sensie silnym dla różnych rozmiarów zadania odpowiadających wartościom parametru MULT = 7, 9, 11, 15, 19 (uwzględnij liczbę rdzeni 1, 2, 4, 10, 20). Wyniki pomiarów czasu zapisz w tabeli.
4. Utwórz odpowiednie wykresy przyspieszenia obliczeń. Zaznacz na jednym wykresie krzywe dla różnych wartości MULT. Skonstruuj co najmniej dwa wykresy, jeden dla swojej najlepszej wersji mnożenia macierzy i drugi dla procedury dgemm z biblioteki MKL (jeśli ta ostatnia jest dostępna)
5. Na podstawie wyników eksperymentów stwórz co najmniej dwa wykresy skalowalności w sensie słabym:
jeden dla swojej najlepszej procedury, drugi dla procedury dgemm. Sekwencja rozmiarów w p.3 jest tak dobrana, aby praca dla kolejnego rozmiaru rosła proporcjonalnie do liczby rdzeni w sekwencji
1,2,4,10,20).
6. Wyciągnij wnioski co do możliwości skalowania obliczeń w jednym węźle dla mnożenia macierz- macierz
7. Rozpakuj paczkę mat_vec_row_MPI_OpenMP.tgz w nowym katalogu np. lab_10/mat_vec_mpi_omp.
8. Uruchom kod przez wykonanie poleceń make i make run. Zaobserwuj możliwość sterowania wykonaniem przez podanie w linii komend parametru -np określającego liczbę prcesów MPI oraz ustalenie wartości zmiennej środowiskowej OMP_NUM_THREADS określającej liczbę wątków OpenMP. W pierwszej fazie przeprowadź badanie dla czystego modelu MPI (liczba wątków OpenMP ustawiona na 1).
9. Przeprowadź badanie skalowalności dla funkcji mnożenia macierz-wektor, analogiczne jak dla funkcji mnożenia macierz-macierz. Tym razem rozważ sekwencję wymiarów np. 3036, 4294, 6072, 9600, 13580 dobraną tak, żeby praca mnożenia macierz-wektor rosła proporcjonalnie do liczby rdzeni w sekwencji 1,2,4,10,20). Wyniki pomiarów czasu zapisz w tabeli.
10. Utwórz odpowiednie wykresy, wyciągnij wnioski co do możliwości skalowania obliczeń w jednym węźle dla mnożenia macierz-wektor. Wnioski dotyczą użytej platformy, w tym implementacji MPI.
Dalsze kroki:
1. Zaobserwuj zjawisko ewentualnego nagłego pogorszenia wydajności mnożenia macierz-macierz w przypadku rozmiaru zadania odpowiadającego wartości MULT=16 (związane jest to z faktem, że rozmiar macierzy jest wtedy wielokrotnością rozmiaru strony pamięci wirtualnej 4096B).
2. Dokonaj optymalizacji array padding. Należy zaalokować obszar jak dla macierzy o rozmiarze większym (np. zwiększyć liczbę kolumn o stały parametr OFFSET). Natomiast obliczenia mają być wykonane jak dla rozmiaru niezmodyfikowanego (funkcja dgemm pozwala na przesyłanie takich macierzy poprzez użycie parametrów leading dimension).
3. Zmodyfikuj odpowiednio własną funkcję mat_mul_... , sprawdź poprawność działania i uzyskaną wydajność (przetestuj różne wartości parametru OFFSET, który powinien być zdefiniowany w pliku sizes.h ).
4. Przeprowadź badanie skalowalności mnożenia macierz-wektor dla zrównoleglenia hybrydowego MPI- OpenMP. Wyciągnij wnioski co do charakterystyki pod tym względem użytej do obliczeń platformy.
Sprawozdanie:
1. Zrealizowane kroki, najważniejsze fragmenty modyfikowanego kodu (a także ewentualnie uzyskiwanego asemblera), spostrzeżenia z analizy kodu (i ewentualnie odpowiadającego kodu asemblera), tabele, wykresy, opisy, wnioski