background image

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

Ćwiczenie:  

Ćwiczenie 9

 

Data oddania: 

10.6.2013 

Imię, Nazwisko: 

Mateusz Zawadzki

 

Ocena: 

Uwagi: 
 

 
 

Cel ćwiczenia 

 

Program  miał  za  zadanie  utworzyć  nowy  typ  zmiennych  o  nazwie  typ,  bazując  na 

istniejącym  juz  typie  double.  Nowy  typ  miał  zawierać  wielkosc  liczb  typu  double,  gdzie 
wielkosc określał również wielkość tablicy wektor

 
Przebieg ćwiczenia 

Poniżej przedstawiony jest listing programu: 

 

int

 main( 

int

 

argc

char

 *

argv

[] ) 

int

 rank; 

int 

size; 

int

 tag = 1; 

const int 

wielkosc=5; 

MPI_Init( 0, 0 ); 
MPI_Comm_rank(

MPI_COMM_WORLD

, &rank);  

MPI_Comm_size(

MPI_COMM_WORLD

, &size);   

MPI_Datatype

 typ;   

//deklaracja nowego typu o nazwie typ

 

MPI_Type_contiguous (wielkosc, MPI_DOUBLE, &typ); 

// definicja nowego typu

 

MPI_Type_commit(&typ); 

//"popełnij" nowy typ

 

MPI_Status 

stat; 

double

 wektor[wielkosc]; 

if (rank == 0) 

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

//wypełnianie tablicy wektor kolejnymi liczbami

 

    { 

        wektor[i]=i; 
    } 
    cout << 

"proces: " 

<<rank ; 

    for(

int

 i=0; i<n; i++) cout<< 

" wektor["

<<i<<

"]="

<<wektor[i]<<

" "

//wypisanie wektora  

 

 

 

 

 

 

 

 

         

//z procesu 0 

    cout <<endl; 
    for(

int

 i=1;i<size;i++) 

        MPI_Send(&wektor[i], 1, typ, i, tag, MPI_COMM_WORLD); 

//wysłanie wektora 

 

 

 

 

 

 

 

 

//nowego typu do procesu 1

 

}else{ 
    MPI_Recv(&wektor, 1, typ, 0, tag

,

 MPI_COMM_WORLD

, &stat); 

//odebranie  

 

 

 

 

 

 

 

//wektora nowego typu od procesu 0

 

background image

    cout << 

"proces: " 

<<rank ;   

 

 

//wypisanie odebranego  

 

 

 

 

 

 

 

 

 

 

//wektora

 

    for(

int

 i=0; i<wielkosc; i++) cout<< 

" wektor["

<<i<<

"]="

<<wektor[i]<<

" "

    cout <<endl; 


MPI_Finalize(); 

//zakończenie bloku MPI

 

return

 0; 


 

 Opis działania programu 

 

Program deklaruje i definiuje wszystkie niezbędne zmienne (rank, size, tag, wielkosc). 

Następnie  inicjalizowany  jest  blok  MPI,  w  którym  to  zmiennej  rank  wpisywana  jest 
informacja o randze procesu, który  aktualnie wykonuje polecenia, a do zmiennej  size, ilość 
procesów biorących udział w wykonywaniu programu.  
 

Program  deklaruje  nowy  typ  zmiennych  o  nazwie  typ,  definiuje  go  (ilość  danych  

w wektorze = wielkosc, typ danych w wektorze = MPI_DOUBLE, dane zostaną zapisane do 
zmiennej o nazwie = &typ), a następnie zapisuje dane do nowego typu zmiennych. 
 

Program zapisuje status wykonywania do zmiennej o nazwie stat. 

 

Tworzony jest nowy wektor o nazwie wektor typu double i wielkości wielkosc. 

 

Blok decyzyjny: Jeśli proces, który wykonuje polecenia ma rangę 0 wypełnia tablicę 

kolejnymi liczbami typu int od 0 do welkosc (bez wartości zapisanej w wielkosc), a następnie 
wypisuje całą zawartość wektora, który został przed chwilą utworzony, oraz wysyła koeljne 
wyrazy wektora wektor do ilości zmiennych wpisanych w typ typ, do procesu o randze 1. 
 

Jeśli proces ma inną rangę niż 0, odbiera wysłane dane a następnie wypisuje na ekran 

otrzymane dane. 
 

Program finalizuje działanie bloku MPI oraz zwraca 0 po zakończeniu działania.