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