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.
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;
}
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,