POLITECHNIKA OPOLSKA
Programowanie współbieżne i rozproszone
Kierunek studiów: |
Informatyka studia II-go stopnia |
Rok studiów: |
I |
Rok akademicki: |
2014 / 2015 |
Semestr: |
I |
Temat: |
|
|
Ćwiczenie 1: Całka |
Lp. |
Imię |
Nazwisko |
Sprawozdanie oddano dnia: |
Ocena: |
1. |
Adam |
Czech |
26.05.2015 |
|
Termin zajęć: |
Prowadzący: |
|
dzień: |
Wtorek |
dr hab. inż. J. Sadecki Prof. PO |
godzina: |
17:50 |
|
grupa: |
L1 |
|
Cel ćwiczenia
Ćwiczenie miało na celu przeprowadzenie badań wydajności program. Wykonany na laboratorium program oblicza całkę na zadanym przedziale w trybie sekwencyjnym, jedno, dwu, trzy i czterowątkowym.
Wybrana do testów całka to:
Obliczenia zostały przeprowadzone w przedziale od 1 do 5. Prawidłowy wynik obliczeń dla tej całki wynosi 0,477756.
Program
Obliczanie całki przeprowadzane jest w pętli FOR, pracuje ona na zadanym przedziale. Przed wykonaniem uruchamiany zostaje zegar, a jego zatrzymanie następuje po przeprowadzeniu obliczeń. Czas zostaje wyświetlony po wykonywania operacji. Pierwsze wykonanie procedury jest sekwencyjne, później program wykonywany jest na jednym, dwóch, trzech i czterech wątkach.
Fragment kodu programu, w którym obliczana jest wartość całki.
start = times(&tms_start);
for (i=0; i < n; i++)
wynik += 1/(3*(i * przedzial + xp)+1);
wynik = przedzial *(wynik+((1/(3*xk+1))+(1/(3*xp+1)))/2);
koniec = times(&tms_koniec);
Aby wykonać operację całkowania na większej liczbie rdzeni wykorzystana została biblioteka OpenMp. Dzięki dyrektywie pragma omp parrarel możliwe jest wykonywanie operacji na zadanej liczbie wątków.
Dyrektywę:
#pragma omp parallel for shared(przedzial, xp, n)
private(i) reduction(+ : wynik) num_threads(3)
Dyrektywa ta przydziela dodatkowe wątki do równoległego wykonania pracy zawartej w konstrukcji. W powyższym przykładzie wykorzystano trzy wątki, dzięki wykorzystaniu parametru num_threads i nadaniu mu wartości 3. Zawiera ona również atrybuty shared i private. Shared oznacza zmienne, których dane wewnątrz równolegle przetwarzanego regionu są współdzielone, oznacza to że są one widoczne i dostępne dla wszystkich wątków jednocześnie. Domyślnie, wszystkie zmienne w regionie współdzielonej pracy są shared z wyjątkiem licznika iteracji pętli, który posiada atrybut private.
Wyniki
Program oblicza prawidłowy wynik dla każdej iteracji, po kilkukrotnym uruchomieniu programu otrzymano czasy wykonania iteracji dla różnej ilości przedziałów. Wyniki zostały wstawione w poniższej tabeli:
Liczba przedziałów [n] |
Czas wykonania [s] |
||||
|
Sekwencyjnie |
1 Wątek |
2 Wątki |
3 Wątki |
4 Wątki |
200000000 |
3,65 |
3,48 |
2,29 |
2,04 |
0,9 |
400000000 |
6,71 |
4,52 |
3,02 |
2,98 |
2,05 |
600000000 |
7,45 |
7,31 |
5,18 |
3,84 |
3,32 |
800000000 |
12,16 |
12,06 |
6,41 |
4,64 |
3,79 |
1000000000 |
14,92 |
14,78 |
7,63 |
4,47 |
3,33 |
1200000000 |
15,46 |
15,02 |
9,06 |
5,54 |
4,10 |
1400000000 |
20,57 |
19,25 |
10,65 |
6,57 |
4,69 |
1600000000 |
23,34 |
22,16 |
12,23 |
7,31 |
5,55 |
1800000000 |
26,16 |
25,87 |
16,64 |
8,45 |
6,16 |
2000000000 |
29,31 |
28,56 |
16,88 |
9,25 |
9,14 |
Na wykresie przedstawiono wyniki czasowe wykonania programu dla liczby przedziałów wynoszącej 1 000 000 000.
Dla przeprowadzonych pomiarów obliczono przyśpieszenie. Dzięki temu możliwe było pokazanie różnicy czasu wykonywania dla poszczególnych wątków.
Wyniki przedstawiono w tabeli:
Liczba przedziałów [n] |
Przyśpieszenie |
||||
|
Sekwencyjnie |
1 Wątek |
2 Wątki |
3 Wątki |
4 Wątki |
200000000 |
1 |
0,17 |
1,36 |
1,61 |
2,75 |
400000000 |
1 |
2,19 |
3,69 |
3,73 |
4,66 |
600000000 |
1 |
0,14 |
2,27 |
3,61 |
4,13 |
800000000 |
1 |
0,1 |
5,75 |
7,52 |
8,37 |
1000000000 |
1 |
0,14 |
7,29 |
10,45 |
11,59 |
1200000000 |
1 |
0,44 |
6,4 |
9,92 |
11,36 |
1400000000 |
1 |
1,32 |
9,92 |
14 |
15,88 |
1600000000 |
1 |
1,18 |
11,11 |
16,03 |
17,79 |
1800000000 |
1 |
0,29 |
9,52 |
17,71 |
20 |
2000000000 |
1 |
0,75 |
12,43 |
20,06 |
20,17 |
ŚREDNIA: |
1 |
0,672 |
6,974 |
10,464 |
11,67 |
Wykres przyśpieszenia:
-
Dzięki wykresowi można zaobserwować, że przyśpieszenie dla 1 wątku jest nawet lepsze, niż dla sekwencji.
4.Wnioski
Przeprowadzone zadanie sprawdziło zależności czasu wykonywania programu od liczby rdzeni. Dzięki bibliotece OpenMp oraz wykorzystaniu dyrektywy
pragma omp parrarel zadnie mogło zostać wykonane. Wyników pokazały, że użycie wielu wątków dla dużych obliczeń pozwala na przyśpieszyć proces ich obliczania, co jest na pewno bardzo pomocne. Należy jednak pamiętać, że wyniki pomiarów mogą być niedokładne ze względu na jednocześnie uruchomione procesy systemu.
WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI
4
Opole 2015
Opole 2015