Programowanie rozproszone
Laboratorium 2
Celem laboratorium było udoskonalenie zdolności w obsłudze MPI i przesyłaniu za jego pomocą komunikatów
#include <stdio.h> #include "mpi.h" int main(int argc, char **argv) { int rank,ranksent,size,source,dest,tag,i,len, position; char name[20]; char buff[1000]; float dim[12], w, w1, w2, w3; int zmienna; len=20; MPI_Status status; MPI_Init(&argc,&argv); // inicjacja wartości MPI_Comm_rank(MPI_COMM_WORLD,&rank); // ranga procesów od 0+ MPI_Comm_size(MPI_COMM_WORLD,&size); // liczba procesów MPI_Get_processor_name(name,&len); // zwraca nazwe hosta na którym wykonywany jest dany proces fprintf(stdout,"Aktywny proces %d - %s\n", rank, name); tag=0; { dest=rank+1; if(rank ==0) { position = 0; for(i=0; i<3; i++) scanf("%f %f %f %f",&dim[i*4], &dim[i*4+1], &dim[i*4+2], &dim[i*4+3]); } MPI_Bcast(&dim, 12, MPI_FLOAT, 0, MPI_COMM_WORLD); if(rank == 5) { MPI_Recv(&w,1,MPI_FLOAT,1,MPI_ANY_TAG,MPI_COMM_WORLD,&status); MPI_Recv(&w1,1,MPI_FLOAT,2,MPI_ANY_TAG,MPI_COMM_WORLD,&status); MPI_Recv(&w2,1,MPI_FLOAT,3,MPI_ANY_TAG,MPI_COMM_WORLD,&status); MPI_Recv(&w3,1,MPI_FLOAT,4,MPI_ANY_TAG,MPI_COMM_WORLD,&status); if(w==0) { fprintf(stdout,"Wyznacznik glowny == 0!\n"); } else { w1=w1/w; w2=w2/w; w3=w3/w; fprintf(stdout,"x = %f\ny = %f\nz = %f\n\n",w1, w2, w3); } } else if(rank>=1 && rank <=4) { switch(rank) { case 1: w=dim[1]*dim[6]*dim[8]+dim[0]*dim[5]*dim[10]+dim[2]*dim[4]*dim[9] -dim[0]*dim[6]*dim[9]-dim[1]*dim[4]*dim[10]-dim[2]*dim[5]*dim[8]; break; case 2: w=dim[1]*dim[6]*dim[11]+dim[3]*dim[5]*dim[10]+dim[2]*dim[7]*dim[9] -dim[3]*dim[6]*dim[9]-dim[1]*dim[7]*dim[10]-dim[2]*dim[5]*dim[11]; break; case 3: w=dim[3]*dim[6]*dim[8]+dim[0]*dim[7]*dim[10]+dim[2]*dim[4]*dim[11] -dim[0]*dim[6]*dim[11]-dim[3]*dim[4]*dim[10]-dim[2]*dim[7]*dim[8]; break; case 4: w=dim[1]*dim[7]*dim[8]+dim[0]*dim[5]*dim[11]+dim[3]*dim[4]*dim[9] -dim[0]*dim[7]*dim[9]-dim[1]*dim[4]*dim[11]-dim[3]*dim[5]*dim[8]; break; } MPI_Send(&w,1,MPI_FLOAT,5,0,MPI_COMM_WORLD); } } MPI_Finalize(); return(0); } |
---|
[ifa114@pc143o PR]$ mpirun -np 6 -hostfile hostfile lab3 Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 2 - pc143o.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl 2 3 -4 -1 3 -2 1 5 -1 3 2 -4 x = 1.000000 y = -1.000000 z = -0.000000 [ifa114@pc143o PR]$ mpirun -np 6 -hostfile hostfile lab3 Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl Aktywny proces 2 - pc143o.uck.pk.edu.pl 1 2 3 4 5 6 7 8 9 10 11 12 Wyznacznik glowny == 0! [ifa114@pc143o PR]$ mpirun -np 6 -hostfile hostfile lab3 Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl Aktywny proces 2 - pc143o.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl 1.5 2.5 6.6 7.3 7.7 3.3 4.5 8.8 3.5 -1.7 5.3 6.4 x = 0.528918 y = 0.182391 z = 0.916764 |
---|
MPI pozwala na szybkie i łatwe programowanie aplikacji rozproszonych. Interfejs MPI umożliwia szybkie i w miarę bezproblemowe przesyłanie tak pojedynczych zmiennych, jak i całych macierzy pomiędzy procesami (hostami) danej aplikacji. Powyższy program dodatkowo uświadamia nam jak bardzo przydatnym może być programowanie aplikacji czy całych systemów rozproszonych, gdyż zamiast obciążać pojedynczą maszynę, możemy rozbić zadania o większej złożoności obliczeniowej na większą liczbę maszyn. Postępowanie takie rekompensuje nieraz nawet użycie mniej wydajnych algorytmów, gdyż nasza aplikacja ma dostęp do zdecydowanie większej liczby zasobów.