Professional Documents
Culture Documents
11:55 wiczenie 3: Zrwnoleglenie algorytmu sortowania. wiczenie wykonano w dniach: 12,19.12.2010 Sprawozdanie oddano dnia: 09.01.2011 ocena:
2. Wst p teoretyczny
Algorytm sortowania b belkowego Algorytm sortowania b belkowego, polega na porwnywaniu ze sob s siaduj cych elementw . Je eli element po lewej jest wi kszy, wtedy oba elementy zamieniamy miejscami. Ca y cykl powtarzamy tyle razy, ile elementw jest w tablicy, b d do momentu, gdy w danym przebiegu nie dokonamy adnej zamiany. Sortowanie poni szej tablicy,
Sortowanie przebiega do momentu, gdy wszystkie elementy s uporz dkowane od najmniejszego do najwi kszego.
Algorytm sortowania quicksort Dzia anie algorytmu polega na wybraniu tzw. elementu osiowego tablicy, przeniesieniu mniejszych elementw na lew stron elementu osiowego, a wi kszych lub rwnych na praw stron . Nast pnie sortuje si pocz tkow i ko cow cze tablicy.
3 2 2 Zes e e y omiarw s y o ci realizacji algory mu. Eleme y uporz dkowane rosn co.
# " !
Tab.3.2.3 Zestawienie wynikw pomiarw szybko ci realizacji algorytmu. Elementy uporz dkowane malej co.
3.3 Obli
ni
W trakcie wyznaczania przyspieszenia algorytmu rwnoleg ego skorzystano z nast puj cego wzoru : (1) S przyspieszenie algorytmu rwnoleg ego, t1W czas wykonania zadania w systemie z jednym w tkiem, i ilo w tkw, tiW czas wykonania zadania w systemie z i-w tkami. W trakcie realizacji wiczenia obliczono przyspieszenia algorytmu rwnoleg ego, w tym celu skorzystano z wzoru (1) :
Tab.3.3.1 Zestawienie wynikw oblicze przyspieszenia algorytmu. Elementy uporz dkowane losowo.
Algory m/Ilo elementw Sekwencyjny Rwnoleg y : 1 w tek Rwnoleg y : 2 w tek Rwnoleg y : 3 w tek Rwnoleg y : 4 w tek
75000 90 92 105 8 53 1 11 01 8 01
50000 39 09 45 75 23 02 5 10 3 62
25000 9 56 11 29 5 63 1 39 0 94
e e e e
100000 99 11 108 26 54 72 18 53 13 89
75000 51 3 60 6 30 69 10 48 7 82
50000 21 89 26 44 13 38 4 64 3 48
25000 5 19 6 38 3 19 1 27 0 88
'
&% $
100000 75000 50000 25000 0,91 0,84 0,82 0,81 1,81 1,67 1,63 1,62 5,34 4,89 4,71 4,08 7,13 6,56 6,29 5,89
Tab.3.3.2 Zestawienie wynikw oblicze przyspieszenia algorytmu. Elementy uporz dkowane rosn co.
100000 75000 50000 25000 0,86 0,85 0,854 0,846 1,65 1,71 1,69 1,69 8,54 8,25 7,66 6,87 11,59 11,35 10,79 10,17
Tab.3.3.3 Zestawienie wynikw oblicze przyspieszenia algorytmu. Elementy uporz dkowane malej co.
3.4 Wykresy
Wyk.3.4.1 Czas realizacji operacji w zale no ci od u ytego algorytmu, liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane losowo.
Wyk.3.4.2 Czas realizacji operacji w zale no ci od u ytego algorytmu, liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane rosn co.
Wyk.3.4.3 Czas realizacji operacji w zale no ci od u ytego algorytmu, liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane malej co.
Wyk.3.4.4 Przyspieszenie w zale no ci od liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane losowo.
Wyk.3.4.5 Przyspieszenie w zale no ci od liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane rosn co.
Wyk.3.4.6 Przyspieszenie w zale no ci od liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane malej co.
//zegar void doit(char *, clock_t ; void quicksort(double tab[], long x, long y ; void swap(int *a,int *b ;
)
int **A; //zmienne wielkosci tablicy int N = 100000, M=1000; //zmienne indeksujace int i,j; //zmienne przechowujace czas clock_t start, end; struct tms t_start, t_end; //wlaczenie odmierzania czasu start = times(&t_start ; printf("Alokacja pamieci...\nwielkosc tablicy:\nA[%d]",N ; //alokacja pamieci A = (int** malloc(N * sizeof(int* ; for (i = 0; i < N; i++ { A[i] = (int* malloc( sizeof(int ; }
00 00 0 0 0 0 0 0
//wpisanie wartosci do tablicy for(i = 0; i < N; i++ A[i][0]=rand( % (M+1 ; //wylaczenie odmierzania czasu end = times(&t_end ; //wyswietlenie czasu inicjalizacji tablicy doit("\nCzas inicjalizacji tablicy", end - start ; //wlaczenie odmierzania czasu start = times(&t_start ; //sortowanie babelkowe - algorytm sekwencyjny for(j = 0; j < N; j++ for(i = 0; i < N - 1; i++ if(A[i][0] > A[i + 1][0] swap(&A[i][0],&A[i + 1][0] ; //wylaczenie odmierzania czasu end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu sekwencyjnego", end - start ;
0 0 0 0 0 0 0 0 0 0 0
//wpisanie wartosci do tablicy for(i = 0; i < N; i++ A[i][0]=rand( % (M+1 ; //wlaczenie odmierzania czasu start = times(&t_start ;
1 1 1 1 1 1 1 1 1
#pragma omp parallel for shared(A,N private(i, j num_threads(1 for(j = 0; j < N; j++ for(i = 0; i < N - 1; i++ if(A[i][0] > A[i + 1][0] swap(&A[i][0],&A[i + 1][0] ;
1 1 1 1 1 1 1 1 1 1
//wylaczenie odmierzania czasu end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -1 watek", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ A[i][0]=rand( % (M+1 ; //rownolegly 2 watki start = times(&t_start ;
1 1 1 1
#pragma omp parallel for shared(A,N private(i, j num_threads(2 for(j = 0; j < N; j++ for(i = 0; i < N - 1; i++ if(A[i][0] > A[i + 1][0] swap(&A[i][0],&A[i + 1][0] ;
1 1 1 1 1
end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -2 watki", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ A[i][0]=rand( % (M+1 ; //rownolegly 3 watki start = times(&t_start ; #pragma omp parallel for shared(A,N private(i, j num_threads(3 for(j = 0; j < N; j++ for(i = 0; i < N - 1; i++ if(A[i][0] > A[i + 1][0] swap(&A[i][0],&A[i + 1][0] ; end = times(&t_end ;
1 1 1 1 1 1 1
1 1
doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -3 watki", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ A[i][0]=rand( % (M+1 ; //rownolegly 4 watki start = times(&t_start ; #pragma omp parallel for shared(A,N private(i, j num_threads(4 for(j = 0; j < N; j++ for(i = 0; i < N - 1; i++ if(A[i][0] > A[i + 1][0] swap(&A[i][0],&A[i + 1][0] ;
2 2 2 2 2 2 2 2 2 2 2 2 2
end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -4 watki", end - start ; // zwolnienie pamieci for (i = 0; i < N; i++ free(A[i] ; free(A ; return 0; } //funkcja obliczajac czas wykonania algorytmu void doit(char *str, clock_t time { long tps = sysconf(_SC_CLK_TCK ; printf("%s: %6.2f secs\n", str, (float time/tps ; }
2 2 2 2 2 2 2
10
4.3 Obliczenia
W trakcie wyznaczania przyspieszenia algorytmu rwnoleg ego skorzystano ze (1 i uzyskano nast puj ce wyniki : Ilo elementw 1000000 1100000 1200000 1300000 Rwnoleg y : 1 w tek 1 1 0,97 1 Rwnoleg y : 2 w tek 1,39 1,59 1,46 1,51
Tab.4.3.1 Zestawienie wynikw oblicze przyspieszenia algorytmu. Elementy uporz dkowane losowo.
3
4.4 Wykresy
Wyk.4.4.1 Czas realizacji operacji w zale no ci od u ytego algorytmu, liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane losowo.
11
Wyk.4.4.2 Przyspieszenie w zale no ci od liczby w tkw przetwarzaj cych zadanie oraz liczby elementw tablicy. Elementy uporz dkowane losowo.
//zegar void doit(char *, clock_t ; void quicksort(double* tab, int N ; void quicksortMT(double* tab2, int N ; int main(int argc, char *argv[] { //zmienne wielkosci tablicy int N = 1000000, M=1000; //wskazniki tablicy double tablica[N];
4 4 4 4
12
//zmienne indeksujace int i,j; //zmienne przechowujace czas clock_t start, end; struct tms t_start, t_end; //wlaczenie odmierzania czasu start = times(&t_start ; printf("Alokacja pamieci...\nwielkosc tablicy:\nA[%d]\n",N ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ tablica[i]=rand( % (M+1 ; //wylaczenie odmierzania czasu end = times(&t_end ; //wyswietlenie czasu inicjalizacji tablicy doit("\nCzas inicjalizacji tablicy", end - start ; //wlaczenie odmierzania czasu start = times(&t_start ; //quicksort - algorytm sekwencyjny quicksort(tablica,N ; //wylaczenie odmierzania czasu end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu sekwencyjnego", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ tablica[i]=rand( % (M+1 ; //wlaczenie odmierzania czasu omp_set_num_threads(1 ; start = times(&t_start ; quicksortMT(tablica,N ; end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -1 watek", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ tablica[i]=rand( % (M+1 ; //rownolegly 2 watki omp_set_num_threads(2 ; start = times(&t_start ; quicksortMT(tablica,N ; end = times(&t_end ;
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
13
doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -2 watki", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ tablica[i]=rand( % (M+1 ; //rownolegly 3 watki omp_set_num_threads(3 ; start = times(&t_start ; quicksortMT(tablica,N ; end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -3 watki", end - start ; //wpisanie wartosci do tablicy for(i = 0; i < N; i++ tablica[i]=rand( % (M+1 ; //rownolegly 4 watki omp_set_num_threads(4 ; start = times(&t_start ; quicksortMT(tablica,N ; end = times(&t_end ; doit("\nCzas wykonania przy uzyciu algorytmu rownoleglego -4 watki", end - start ; } //funkcja obliczajac czas wykonania algorytmu void doit(char *str, clock_t time { long tps = sysconf(_SC_CLK_TCK ; printf("%s: %6.2f secs\n", str, (float time/tps ; }
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
void quicksort(double* tab, int N { int i, j; double v,t; if(N <= 1 return;
6
// Partition elements v = tab[0]; i = 0; j = N; for(;; { while(i++ < N && tab[i] < v ; while(--j >= 0 && tab[j] > v ;
6 6 6
14
if(i >= j break; t = tab[i]; tab[i] = tab[j]; tab[j] = t; } t = tab[i-1]; tab[i-1] = tab[0]; tab[0] = t; quicksort(tab, i-1 ; quicksort(tab+i, N-i ; }
7 7 7 7
if(N <= 1 return; // Partition elements v = tab2[0]; i = 0; j = N; for(;; { while(i++ < N && tab2[i] < v ; while(--j >= 0 && tab2[j] > v ; if(i >= j break; t = tab2[i]; tab2[i] = tab2[j]; tab2[j] = t; } t = tab2[i-1]; tab2[i-1] = tab2[0]; tab2[0] = t; #pragma omp parallel sections { #pragma omp section quicksort(tab2, i-1 ; #pragma omp section quicksort(tab2+i, N-i ; } }
7 7 7 7 7 7
5. Wnioski
Algorytm sortowania b belkowego to najprostszy tego typu algorytm, ale niekoniecznie najefektywniejszy najlepiej sprawdza si podczas sortowania niewielkich ci gw i przy zrwnolegleniu z wykorzystaniem maksymalnej liczby w tkw. Implementacja zrwnoleglenia jest bardzo prosta - wystarczy zrwnoleglenie na poziomie zewn trznej p tli for. Natomiast algorytm quicksort jest niezwykle efektywny, dla d ugich ci gw. Niestety zrwnoleglenie nie zawsze dzia a tak jak powinno, a efekt, ze wzgl du na rekurencje wyst puj c w algorytmie, jest trudny do przewidzenia.
15
6. Literatura
[1] Praca zbiorowa pod redakcj A.Karbowski i E.Niewiadomska-Szynkiewicz, "Programowanie rwnoleg e i rozproszone , Warszawa 2009 OWPW [2] Bielecki W., "PRZETWARZANIE RWNOLEG E I ROZPROSZONE CZ. 1. Wydawnictwo Politechniki Szczeci skie
16