background image

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

Ćwiczenie:  

Ćwiczenie 8

 

Data oddania: 

10.6.2013 

Imię, Nazwisko: 

Dawid Misiniec

 

Ocena: 

Uwagi: 
 

 
 

1. 

Cel ćwiczenia: 

 

Celem  ćwiczenia  było  zapoznanie  się  z  funkcjami  komunikacji  kolektywnej  

w celu obliczenia 

całki na przedziale <0, 4> dla funkcji f(x) = x

2

 

2. 

Przebieg ćwiczenia: 

 
 

Funkcje użyte w programie, służące do rozsyłania komunikatów kolektywnych: 

MPI_Bcast ( buffer, count, datatype, root, comm )  
Rozgłasza wiadomość z procesu o identyfikatorze "root" do wszystkich procesów w 
grupie włącznie z nim samym. 
buffer - 

adres w pamięci początku bufora (zleży od wyboru); 

count - 

ilość elementów w buforze (integer); 

datatype - 

typ danych elementów bufora (handle); 

root - 

rank procesu rozsyłającego (handle); 

comm - komunikator (handle);  
 
MPI_Reduce ( sendbuf, recvbuf, count, datatype, op, root, comm )  
Redukuje wartości we wszystkich procesach do pojedynczej wartości. 
sendbuf
 - 

adres bufora wysyłania; 

count - 

ilosć elementów w buforze wysyłania (integer); 

datatype - 

typ danych w buforze wysłania (handle);  

op - operacja redukcji (handle);  
root - rank procesu root (integer); 
comm - komunikator (handle); 
 
Powyższe funkcje zastosowano w następujący sposób: 
 

if (rank == 0) 

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

MPI_Bcast(&czesci, 1, MPI_INT, 0, MPI_COMM_WORLD); 

 
Tylko proces o randze 0 przyjmował ilość części na jakie został podzielony przedział 
funkcji,  był  on  zatem  odpowiedzialny  za  rozesłanie  tej  informacji  do  wszystkich 
pozostałych procesów, co nastąpiło dzięki poleceniu MPI_Bcast. 
 
Po  wszystkich  niezbędnych  operacjach obliczeniowych  wykonywanych  przez  każdy 
proces osobno na innym zbiorze danych (całki lokalne i sumy lokalne) następowało 

background image

ich  sumowanie  w  proces

ie  0,  za  pomocą  funkcji  MPI_Reduce,  wykorzystanej  

w następujący sposób: 
 

MPI_Reduce(&calkalok,&calka,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); 
 
Powyższy  zapis,  sumuje  wszystkie  wartości  sygnowane  nazwą  calkalok  i  zapisuje  je  do 
zmiennej calka.  
 
Przygotowany  przez  nas  program,  obliczał  wartość  całki  obliczanej  dwoma  metodami: 
prostokątów  oraz  trapezów.  W  zależności  od  doboru  metody,  ilości  przedziałów  oraz 
uruchomionych  procesów  zmieniał  się  czas  obliczeń,  oraz  błąd  względny  (błąd  obliczany 
przez odjęcie wartości obliczonej całki od jej faktycznej wartości, która dla przedziału <0, 4> 
wynosi 21 

 
 

 ). 

 

3. 

Wynik działania programu: 

 
Metoda prostokątów, 10, 100 i 1000 przedziałów dla 1 procesu: 
 

 

 
 
 
 
 

 

background image

Metoda prostokątów dla 10, 100 i 1000 przedziałów dla 2óch procesów: 
 

 

 
Metoda trapezów dla 10, 100 i 1000 przedziałów dla 1 procesu: 
 

 

 

 

 

background image

Metoda trapezów dla 10, 100 i 1000 przedziałów dla 2óch procesów: