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;
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:
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:
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.