Programowanie równoległe i współbieżne
Ćwiczenie:
Ćwiczenie 9
Data oddania:
23.5.2013
Imię, Nazwisko:
Dawid Misiniec
Ocena:
Uwagi:
1.
Cel ćwiczenia
Celem ćwiczenia było wykonanie programu, który tworzy nowy typ zmiennych, bazując na
istniejącym juz typie double. Nowy typ miał zawierać n liczb typu double, gdzie n określał również
wielkość tablicy a.
2.
Przebieg ćwiczenia
Poniżej przedstawiony jest kod źródłowy zawarty w utworzonym programie:
int main( int argc, char *argv[] )
{
int rank;
int size;
int tag = 1;
const int n=5;
MPI_Init( 0, 0 );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Datatype typ;
MPI_Type_contiguous (n, MPI_DOUBLE, &typ);
MPI_Type_commit(&typ);
MPI_Status stat;
double a[n];
if (rank == 0)
{
for(int i=0; i<n;i++)
{
a[i]=i;
}
cout << "proces o randze: " <<rank ;
for(int i=0; i<n; i++) cout<< " a["<<i<<"]="<<a[i]<<" ";
cout <<endl;
for(int i=1;i<size;i++)
MPI_Send(&a[i], 1, typ, i, tag, MPI_COMM_WORLD);
}else{
MPI_Recv(&a, 1, typ, 0, tag, MPI_COMM_WORLD,&stat);
cout << "proces o randze: " <<rank ;
for(int i=0; i<n; i++) cout<< " a["<<i<<"]="<<a[i]<<" ";
cout <<endl;
}
MPI_Finalize();
return 0;
}
1) Program po kolei deklaruje wszystkie zmienne (rank - numer aktualnego procesu,
size -
ilość wszystkich procesów, tag, n - stała odpowiadająca za wielkość
tablicy/wektora a).
2) Rozpoczy
na działanie programu, jako programu wieloprocesowego.
3) Inicjuje
komunikator, którym zapisuje ilość i rangę procesów do poszczególnych
zmiennych.
4)
N
astępnie deklaruje nowy typ zmiennych o nazwie typ.
5)
Za
pomocą funkcji MPI_Type_contiguous, ustala, że nowy typ zmiennych o nazwie
typ, będzie przechowywał n zmiennych typu MPI_DOUBLE.
6)
MPI_Type_commit powoduje zatwierdzenie nowego typu zmiennych o nazwie typ.
7)
Następnie do zmiennej o nazwie stat, zapisywany jest status komunikatu
(wysłany/odebrany).
8)
Deklaracja tablicy/wektora typu double o n elementach.
9)
Sprawdzenie warunku: jeśli proces, jest procesem 0ym, musi wypełnić tablicę a
kolejnymi liczbami typu int od 0 do n-
1, a następnie wypisać tą tablicę.
10)
Zerowy proces wysyła fragment tablicy a zmniejszonej o 1 do każdego kolejnego
procesu.
11)
Jeśli warunek z 9) nie jest spełniony (proces jest procesem innym niż 0wy), następuje
odebranie przesyłanego komunikatu, oraz wypisanie tablicy, która została odebrana.
12)
Finalizacja działa programu wieloprocesowego.
13)
Program zwraca 0.
3. Wnioski
Możliwe jest stworzenie nowego typu zmiennych, bazując na istniejącym typie.
Można wykonywać normalne operacje na typie pochodnym, tak samo jak na
typie pierwotnym.
Stworzenie nowego typu, który jest typem pochodnym do istniejącego, może
skrócić ilość linijek kodu, oraz czas jego wykonywania.