Programowanie rozproszone
Laboratorium 3
Celem laboratorium było udoskonalenie zdolności w obsłudze MPI i przesyłaniu za jego pomocą komunikatów
#include <stdio.h> #include <math.h> #include "mpi.h" int main(int argc, char **argv) { int rank,ranksent,size,source,dest,tag,i,len, pcs, max; char name[20]; char buff[1000]; float res,total; 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) { scanf("%d", &pcs); } MPI_Bcast(&pcs, 1, MPI_INT, 0, MPI_COMM_WORLD); if(rank != 0) { max = (int)floor(pcs / (size-2)); res=0; if(rank==size-1) { i=max*(size-2); max=pcs; } else { i=(rank-1)*max; max*=rank; } fprintf(stdout,"%2d:\t%8d - %8d\n",rank,i,max); while(i < max) { if(i%2==0) res+=(float)1/(2*i+1); else res-=(float)1/(2*i+1); i++; } MPI_Send(&res,1,MPI_FLOAT,0,0,MPI_COMM_WORLD); } else { total=0; for(i=1;i<size;i++) { MPI_Recv(&res,1,MPI_FLOAT,i,MPI_ANY_TAG,MPI_COMM_WORLD,&status); total+=res; } fprintf(stdout,"PI = %f\n",4*total); } MPI_Finalize(); return(0); } |
---|
[ifa114@pc143o PR]$ mpirun -hostfile hostfile -np 7 lab4 Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 6 - pc143o.uck.pk.edu.pl Aktywny proces 2 - pc143o.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl 1000000000 2: 200000000 - 400000000 6: 1000000000 - 1000000000 5: 800000000 - 1000000000 1: 0 - 200000000 3: 400000000 - 600000000 4: 600000000 - 800000000 PI = 3.141597 [ifa114@pc143o PR]$ mpirun -hostfile hostfile -np 7 lab4 Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl Aktywny proces 6 - pc143o.uck.pk.edu.pl Aktywny proces 2 - pc143o.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl 6753 2: 1350 - 2700 6: 6750 - 6753 1: 0 - 1350 3: 2700 - 4050 5: 5400 - 6750 4: 4050 - 5400 PI = 3.141738 [ifa114@pc143o PR]$ mpirun -hostfile hostfile -np 7 lab4 Aktywny proces 2 - pc143o.uck.pk.edu.pl Aktywny proces 1 - pc143c.uck.pk.edu.pl Aktywny proces 0 - pc143b.uck.pk.edu.pl Aktywny proces 4 - pc143b.uck.pk.edu.pl Aktywny proces 6 - pc143o.uck.pk.edu.pl Aktywny proces 5 - pc143c.uck.pk.edu.pl Aktywny proces 3 - pc143p.uck.pk.edu.pl 123 2: 24 - 48 6: 120 - 123 5: 96 - 120 1: 0 - 24 3: 48 - 72 4: 72 - 96 PI = 3.149723 |
---|
Stworzony program jak widać bazuje na doświadczeniach i wiedzy zdobytej podczas wcześniejszych laboratoriów. 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. W programie tym dzielę liczbę wyliczanych elementów szeregu równo pomiędzy procesy z rangą > 0. Procesy te po wyliczeniu zwracają wyniki do procesu z rangą==0, który to sumuje wyniki cząstkowe i zwraca przybliżoną wartość liczby PI, której wartość w zależności od ilości elementów ciągu bardziej lub mniej pokrywa się z prawdziwą wartością liczby PI.