Przetwarzanie współbieżne
Grupa: Data lab:
Autor: Mateusz Skrzypek
3,5
Czwartek, 14:30 20 III 2014
Cele laboratorium:
" Doskonalenie nabytych umiejętności programowania z wykorzystaniem biblioteki pthreads.
Zrealizowane kroki: 1-3
Ad. 1,2,3.
Przy uruchomieniu jako argument podajemy liczbę wątków na ilu chcemy, aby nasz program
działał. Następnie podajemy ilość składników szeregu Leibniza jakie chcemy obliczyć.
Poszczególne wyrazy są dzielone równo pomiędzy wątkami. Jeżeli liczby nie będzie można
podzielić to reszta z dzielenia dodawana jest do wątku ostatniego.
Poniżej umieszczam kod całego programu: lab_dod.c
#include
#include
#include
#include
#include
//////////***********************************************************//////
//////
////////// Uruchomienie: ./lab_dod
////////////
//////////***********************************************************//////
//////
double suma_globalna = 0;
typedef struct {
int ilosc_elementow;
int poczatek;
}szereg;
void * funkcja_watku (void * arg_wsk)
{
int i;
szereg* arg = (szereg*) arg_wsk;
for(i=arg->poczatek; iilosc_elementow; i++){
suma_globalna += (pow(-1,i)/(2*i +1));
}
return(NULL);
}
int main(int argc, char* argv[]) {
int ilosc_watkow = atoi(argv[1]);
pthread_t tablica_tid[ilosc_watkow];
int i,ilosc_elementow, ilosc_dla_watku,ilosc_dla_ostatniego;
szereg wyraz;
double roznica=0;
printf("Podaj ilosc skladnikow szeregu: ");
scanf("%d", &ilosc_elementow); //ilość wyrazów szeregu dla
poszczególnych wątków
ilosc_dla_watku = ilosc_elementow/ilosc_watkow;
ilosc_dla_ostatniego = ilosc_elementow%ilosc_watkow;
int tab_ind[ilosc_watkow];
for(i=0; i if(i tab_ind[i]=ilosc_dla_watku;
else
tab_ind[i] = ilosc_dla_watku+ilosc_dla_ostatniego;
}
inicjuj_czas();
for(i=0; i wyraz.ilosc_elementow = tab_ind[i];
wyraz.poczatek = i*ilosc_dla_watku;
pthread_create(&tablica_tid[i], NULL, funkcja_watku, (void*)&p);
pthread_join(tablica_tid[i], NULL);
}
drukuj_czas();
roznica = fabs(M_PI - suma_globalna*4);
printf("\n\n\nWartosc liczby PI: %.10lf obliczona na %d watkach po %d
iteracjach\nTablicowa wartosc liczby PI: %.10lf\nRoznica:
%.10lf\n\n\n",suma_globalna*4,ilosc_watkow,ilosc_elementow,M_PI,roznica);
return 0;
}
Poniżej wydruki konsolowe działającego kodu:
Na początku porównałem szybkość działania operacji na 1, 2 lub 4 wątkach (liczba jest
dobrana losowo). Można od razu zauważyć, że program najszybciej liczy dla największej liczby
wątków. Liczba wyrazów z jakiej składał się szereg wynosiła 100mln. Poniżej umieszczam screeny z
tych testów.
Dodatkowo wybrałem dowolną liczbę wątków i sprawdziłem działanie jeszcze na innej
wartości składników szeregu. Poniżej umieszczam zrzuty ekranów.
Różnica między wartością tablicową, a wartością wyliczoną liczby PI dla coraz większej
ilości wyrazów w szeregu jest coraz mniejsza dokładniejsza.
Wyszukiwarka
Podobne podstrony:
33B Skrzypek Mateusz LAB 5
33B Kupczyk Wojciech LAB 3
lab 9 Krol Mateusz AUT2
spr lab nr 7 Suchocki Mateusz I1G1S4
Lab cpp
lab 2
T2 Skrypt do lab OU Rozdział 6 Wiercenie 3
IE RS lab 9 overview
lab pkm 3
M 8 Mateusz Wittstock
lab chemia korozja
lab tsp 3
Ewangelia Pseudo Mateusza
Lab
więcej podobnych podstron