background image

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

Ćwiczenie:  

Ćwiczenie 10

 

Data oddania: 

10.6.2013 

Imię, Nazwisko: 

Dawid Misiniec

 

Ocena: 

Uwagi: 
 

 
 

1. 

Cel ćwiczenia: 

 

Celem ćwiczenia było zapoznanie się z zastosowaniem typów pochodnych. 
 

2. 

Przebieg ćwiczenia: 

 
 

Przygotowywany przez nas program, m

iał tworzyć wektor wypełniony pewnymi 

wartościami, a następnie za pomocą typu pochodnego rozesłać nowe dane do 
poszczególnych procesów. Poniższy schemat ilustruje działanie programu: 

 

 
 

Bazowy wektor miał zostać wypełniony liczbami z zakresu {11, 12, 13, 21, 22, 

23,  …  ,  111,  112,  113},  a  następnie  "poszatkowany"  przez  typ  pochodny,  który 
obcina  wyjściowy  wektor  o  co  trzecią  wartość.  Dla  ilości  procesów  większej  niż  3 
wyświetlone zostanie 2 x (n-1) bloków, gdzie n to ilość uruchomionych procesów. 
 
 

 

background image

3.  Listing programu 
int main( int argc, char *argv[] ) 

 

MPI_Init( 0, 0 ); 

 

MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

 

MPI_Comm_size(MPI_COMM_WORLD, &size); 

 

if (size < 2) 

 

 

 

cout << "Odpalono za malo procesow" << endl; 

 

 

MPI_Finalize(); 

 

 

MPI_Status status; 

 

MPI_Datatype typ; 

 

double * wektor, *wektor2; 

 

MPI_Type_vector(2, 2, 3, MPI_DOUBLE, &typ); 

 

MPI_Type_commit(&typ); 

 

int liczba = 11; 

 

wektor = new double [size*3]; 

 

for (int i = 0; i < (size*3); i++) 

 

 

 

wektor[i] = liczba; 

 

 

liczba++; 

 

 

if (liczba % 10 > 3) 

 

 

liczba += 7; 

 

 

if (rank == 0) 

 

 

 

for (int i = 1; i < size; i++){ 

 

 

MPI_Send(wektor, 1, typ, i, 100, MPI_COMM_WORLD); 

 

 

cout << "proces: " <<rank ; 

 

for(int i=0; i<n; i++) cout<< " wektor["<<i<<"]="<<wektor[i]<<" ";  

cout <<endl;

 

 

}else 

 

 

 

wektor2 = new double [size*2]; 

 

 

MPI_Recv(wektor2, size*2, MPI_DOUBLE, 0, 100,    

 

 

 

MPI_COMM_WORLD, &status); 

 

 

cout << "Proces " << rank << " "; 

 

 

int ile = rank*2; 

 

 

if (size == 2) ile = 4; 

 

 

for (int i = 0; i < (ile); i++) 

 

 

 

cout << "wektor2[" << i << "]=" << wektor2[i] << " "; 

 

 

cout << endl; 

 

 

MPI_Finalize(); 

 

return 0; 

 

 

background image

4. 

Wynik działania programu: 

Wynik działania programu dla dwóch procesów: 

 

 
Wynik działania programu dla 3 procesów: 

 

 
5.  Wnioski 

  Typy pochodne 

pozwalają na szybką modyfikację dużej ilości danych, 

 

Jeśli  ilość  danych  jest  zbyt  mała,  aby  zapełnić  cały  typ  pochodnych, 
pozostałe dane zostaną zignorowane,