Przetwarzanie współbieżne |
---|
Wojciech Kupczyk 94415 |
Cele laboratorium:
• Doskonalenie nabytych umiejętności programowania z wykorzystaniem biblioteki pthreads.
Zrealizowane zadania: 1-3
Ad. 1-3. Program pobiera jako argument ilość wątków na których ma pracować. Po uruchomieniu podajemy liczbę składników szeregu Leibniza, które chcemy obliczyć. Ilość składników jest równo dzielona pomiędzy wątki, natomiast w przypadku niemożliwości równego podziału, reszta z dzielenia jest dodawana do ostatniego wątku. Kod programu i widok jego wykonania załączam poniżej.
double suma_glob = 0; typedef struct { int indeks_poczatkowy; int ilosc; }parametry; void * zadanie_watku (void * arg_wsk) { int i; parametry* arg = (parametry*) arg_wsk; printf(" ----\n\tWatek liczy %d wyrazow zaczynajac od %d\n ----\n",arg->ilosc, arg->indeks_poczatkowy); for(i=arg->indeks_poczatkowy; i<arg->ilosc; i++){ suma_glob += (pow(-1,i)/(2*i +1)); } return(NULL); } //////////***********************************************************//////////// int main(int argc, char* argv[]) { int il_watkow = atoi(argv[1]); pthread_t tablica_tid[il_watkow]; int i,ilosc, ilosc_dla_watku,ilosc_dla_ostatniego; parametry p; double roznica=0; printf("Podaj ilosc skladnikow szeregu: "); scanf("%d", &ilosc); //ilosc skladnikow szeregu dla poszczegolnych watkow ilosc_dla_watku = ilosc/il_watkow; ilosc_dla_ostatniego = ilosc%il_watkow; int tab_ind[il_watkow]; for(i=0; i<il_watkow; i++) { if(i<il_watkow-1)tab_ind[i]=ilosc_dla_watku; else tab_ind[i] = ilosc_dla_watku+ilosc_dla_ostatniego; } inicjuj_czas(); for(i=0; i<il_watkow; i++){ p.ilosc = tab_ind[i]; p.indeks_poczatkowy = i*ilosc_dla_watku; pthread_create(&tablica_tid[i], NULL, zadanie_watku, (void*)&p); pthread_join(tablica_tid[i], NULL); } drukuj_czas(); roznica = fabs(M_PI - suma_glob*4); printf("\n********************************\nLiczba PI obliczona na %d watkach po %d iteracjach: %.10lf\nTablicowa wartosc: %.10lf\nRoznica: %.10lf\n********************************\n\n",il_watkow,ilosc,suma_glob*4,M_PI,roznica); return 0; } |
---|
Na screen’ach widać, że program dla większej ilości wątków wykonuje obliczenia szybciej. Dokładność obliczeń wzrasta wraz ze zwiększaniem ilości składników szeregu, więc możemy uznać, że zadanie zostało wykonane poprawnie.