background image

Programowanie równoległe i współbieżne 

Ćwiczenie:  

Ćwiczenie 8

 

Data oddania: 

10.6.2013 

Imię, Nazwisko: 

Mateusz Zawadzki

 

Ocena: 

Uwagi: 
 

 
 

Cel ćwiczenia 

 

Program miał za zadanie policzyć całkę dla paraboli o wzorze f(x) = x

2

, dla przedziału 

od 0 do 4, dla różnej ilości przedziałów oraz procesów. 

 
Przebieg ćwiczenia 

Poniżej przedstawiony jest listing programu: 

 

int main( int argc, char *argv[] ) 

int rank; 
int size; 
int tag = 1; 
double calkalok,calka,calkatraplok,calkatrap; 
double sumatrap, xtrap,suma,x; 
int czesci; //na ile czesci ma podzielic funkcje 
double szerokosc; 
double czas, t1, t2; 
 
MPI_Init( 0, 0 ); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank);  
MPI_Comm_size(MPI_COMM_WORLD, &size); //ilosc zaangazowanych procesow 
 
if (rank == 0) 

    cout<< "na ile czesci podzielic funkcje? "; 
    cin >> czesci; 

t1 = MPI_Wtime (); 
MPI_Bcast(&czesci, 1, MPI_INT, 0, MPI_COMM_WORLD); 
 
if (czesci !=0){ 
szerokosc = 4/double(czesci);  
suma=0; 
calkalok=0; 
sumatrap=0; 
calkatraplok=0; 
for (int i = rank+1; i<=czesci; i+=size) 

    x=double(i)*szerokosc; 
    suma+=(x*x); 
    xtrap=(double(i)-0.5)*szerokosc; 
    sumatrap+=(xtrap*xtrap); 
   } 
calkalok=szerokosc*suma; 

background image

calkatraplok=szerokosc*sumatrap; 
cout<< "Dla procesu o rank: " <<rank <<" calka prostokatna lokalna = " <<calkalok<<endl; 
cout<< "Dla procesu o rank: " <<rank <<" calka trapezowa lokalna = " <<calkatraplok<<endl; 
MPI_Reduce(&calkalok,&calka,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); 
MPI_Reduce(&calkatraplok,&calkatrap,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); 
 
if (rank == 0) { 
    cout<<"calka globalna(prostokaty): " <<calka<< " blad wynosi: "<< calka-21.3333<<endl; 
    cout<<"calka globalna(trapezy): " <<calkatrap<< " blad wynosi: "<< calkatrap-
21.3333<<endl; 

 t2 = MPI_Wtime (); 
 czas = t2-t1; 
 cout<< "czas obliczen wynosi: " <<czas <<" sekund."<<endl; 
}else cout<< "szalony! calka z 0 czesci?!"; 
MPI_Finalize(); 
return 0; 
}

 

  
Opis działania programu 

 

Program definiuje i/lub deklaruje wszystkie potrzebne zmienne (zmienne z dopiskiem 

lok  są  zmiennymi,  które  licząc  całkę  cząstkową,  lokalną  dla  każdego  procesu,  zmienne  
z dopiskiem trap liczą odpowiednie wartości dla całki metodą trapezów).  
 

Blok decyzyjny: Jeśli proces wykonujący program ma rangę 0, zadaje pytanie na ile 

części należy podzielić przedział <0, 4> dziedziny funkcji. 
 

Każdy  proces  wykonujący  program  rozpoczyna  liczenie  czasu,  następnie  następuje 

rozesłanie  do  wszystkich  procesów  ilości  części,  na  jakie  został  podzielony  przedział 
dziedziny funkcji. 
 

Blok decyzyjny: Jeśli ilość części jest różna od 0, następuje zerowanie poszczególnych 

wartości  lokalnych,  oraz  obliczenie  wartości  całki  lokalnej  metodą  trapezów  i  prostokątów. 
Każdy proces wypisuje wartość całki lokalnej, którą policzył, a następnie wszystkie wyniki są 
wysyłane  do  procesu  0,  który  je  sumuje  i  wyświetla  obliczoną  wartość  całki  z  funkcji  
f(x)  =  x

2

,  kończy  obliczanie  czasu  i  wypisuje  jak  długo  zajęły  obliczenia  oraz  oblicza  błąd 

obliczeń zależny od dobranej metody obliczeń. 
 

Program finalizuje działanie bloku MPI oraz zwraca 0 po wykonaniu całego kodu. 

 

 

 

Wynik działania programu 

Poniżej przestawiono wynik działania powyższego programu: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

background image

Obliczenia całki metodą prostokątów dla 10, 100 i 1000 przedziałów, dla jednego procesu: 
 

 

 
Obliczenia całki metodą prostokątów dla 10, 100 i 1000 przedziałów dla dwóch procesów: 
 

 

 
 

 

background image

Obliczenia całki metodą trapezów dla 10, 100 i 1000 przedziałów dla jednego procesu.: 
 

 

 
Obliczenia całki metodą prostokątów dla 10, 100 i 1000 przedziałów dla dwóch procesów: 
 

 

 
Wnioski 

 

Zwiększenie  ilości  procesów  biorących  udział  w  obliczeniach,  spowodowało 
wydłużenie czasu obliczeń, 

 

Zwiększenie ilości przedziałów spowodowało wydłużenie się czasu obliczeń, 

 

W zależności od ilości przedziałów zmienia się wartość całki, 

 

Im większa ilość przedziałów, tym mniejszy jest błąd obliczeń, 

  Podzielenie wybranego fragmentu dziedziny tej funkcji na około 1000 przedziałów 

wystarczy, aby otrzymać zadowalająco dokładne obliczenia wartości całki.