sprawozdanie lab10.odt

(104 KB) Pobierz

Programowanie równoległe                            Konrad Rugała gr V

Celem ćwiczenia była zaimplementowanie programu, który obliczał sumę elementów macierzy stosując różne sposoby zrównoleglenia.

Należało wykorzystać podział statyczny oraz dynamiczny iteracji pętli for. Do tego celu wykorzystaliśmy dyrektywy:

schedule(static, 3) dzieli iteracje w sposób statyczny (każdy wątek dostaje tyle samo porcji) oraz ustawia rozmiar porcji na 3.

schedule(static) dzieli iteracje w sposób statyczny oraz ustawia rozmiar porcji na wartość domyślną.

schedule(dynamic, 3) dzieli iteracje w sposób dynamiczny (przydziela więcej porcji wątkom mniej obciążonym) oraz ustawia rozmiar porcji na 3.

schedule(dynamic) dzieli iteracje w sposób dynamiczny z domyślną wielkością porcji.

 

Wyniki zostały przedstawione w sposób graficzny na wykresie nr 1. Jak widać, wykonanie sekwencyjne jest dużo wolniejsze od wykonania równoległego. Również czas wykonania z podziałem dynamicznym jest szybszy od podziału statycznego.

 

Następnie porównane zostały pomiary czasów obliczeń w zależności od ilości elementów macierzy. Macierze rozmiarze 100 lub mniej są obliczane szybciej w sposób sekwencyjny. Wynika to z czasu potrzebnego na utworzenie wątków. Macierze o rozmiarach większych od 100 są przetwarzane znacznie szybciej w sposób równoległy. Obrazuje to wykres numer 2.

 

Kolejnym krokiem było sprawdzenie jaka metoda zrónoleglenia jest lepsza przy dwóch zagnieżdżonych pętlach. Jak widać na wynikach przedstawionych na rysunku numer 3, zrównoleglenie pętli wewnętrznej jest bardzo nieoptymalne.

 

Etapem dodatkowym było wykonanie programu mnożącego macierz razy wektor. Podział danych między wątki miał zostać dokonany na trzy sposoby:

                      wierszowo

                      kolumnowo

                      blokowo

Program należało odpalić dla dwóch rozmiarów macierzy. Dla macierzy o rozmiarze 1000x1000 najszybsze wykonanie zapewniła metoda sekwencyjna (Rysunek 1). Natomiast dla macierzy o rozmiarze 10000x10000 najszybszy okazał się podział wierszowy przy wykonaniu równoległym.

 

Przy projektowaniu programów warto zwrócić uwagę czy wykonanie równoległe będzie korzystne. Próba zróbnoleglenia programu może skończyć się jego spowolnieniem. Warty zauważenia jest fakt, że operacje na macierzach wykonują się szybciej przy dynamicznym podziale zadań i zrównolegleniu kolumnowym. Przy zrównoleglaniu zagnieżdżonych pętli należy pamiętać, że nie warto zrównoleglać pętli wewnętrznej tylko zewnętrzną. Tego przyczyną jest czas potrzebny na utworzenie wątków. Dla pętli zewnętrznej jest on proporcjonalny do liczby wątków, a dla wewnętrznej do liczby wątków pomnożonej przez liczbę iteracji pętli zewnętrznej.

 

Wykres 1

Wykres 2

Rysunek 1

Rysunek 2

Rysunek 3

Zgłoś jeśli naruszono regulamin