Programowanie rozproszone
Laboratorium 1
Celem laboratorium było opanowanie programowania z przesyłaniem komunikatów za pośrednictwem biblioteki MPI.
#include <stdio.h> #include "mpi.h" int main(int argc, char **argv) { int rank,ranksent,size,source,dest,tag,i,len; int zmienna; char name[20]; 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 do{ scanf("%d",&zmienna); MPI_Bcast(&zmienna, 1, MPI_INT,0,MPI_COMM_WORLD); if(rank !=0) { fprintf(stdout,"%d -> %d przeslano %d na %s\n", status.MPI_SOURCE, rank, zmienna, name); } }while(zmienna>=0); MPI_Finalize(); // Koniec pracy z MPI return(0); } |
---|
#include <stdio.h> #include "mpi.h" int main(int argc, char **argv) { int rank,ranksent,size,source,dest,tag,i,len; char name[20]; 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 tag=0; do { dest=rank+1; scanf("%d",&zmienna); if(rank ==0) { MPI_Send(&zmienna,1,MPI_INT,dest,tag,MPI_COMM_WORLD); } else { MPI_Recv(&zmienna,1,MPI_INT,rank-1,MPI_ANY_TAG,MPI_COMM_WORLD,&status); fprintf(stdout,"%d -> %d przeslano %d na %s\n", status.MPI_SOURCE, rank, zmienna, name); if(rank+1<size) MPI_Send(&zmienna,1,MPI_INT,dest,tag,MPI_COMM_WORLD); } }while(zmienna>=0); MPI_Finalize(); return(0); } |
---|
lunar@andLinux:~/windows$ mpirun -np 5 lab2b 7 0 -> 2 przeslano 7 na andLinux 0 -> 4 przeslano 7 na andLinux 0 -> 1 przeslano 7 na andLinux 0 -> 3 przeslano 7 na Moon -2 0 -> 2 przeslano -2 na andLinux 0 -> 1 przeslano -2 na Moon 0 -> 4 przeslano -2 na andLinux 0 -> 3 przeslano -2 na andLinux |
---|
lunar@andLinux:~/windows$ mpirun -np 5 lab2c 7 0 -> 1 przeslano 7 na andLinux 1 -> 2 przeslano 7 na andLinux 2 -> 3 przeslano 7 na andLinux 3 -> 4 przeslano 7 na andLinux -2 0 -> 1 przeslano -2 na andLinux 1 -> 2 przeslano -2 na andLinux 2 -> 3 przeslano -2 na Moon 3 -> 4 przeslano -2 na Moon |
---|
MPI jest ciekawym, szybkim i prostym sposobem na wykorzystanie wielu zasobów sprzętowych w jednym programie. To co warto zaznaczyć to sposób działania programu. Otóż biblioteka MPI tak naprawdę przeprowadza za nas synchronizację… nieraz wręcz jest w tym mądrzejsza niż byśmy chcieli – np. nie pozwala na natychmiastowe wypisanie informacji na ekranie jeśli w danym ciągu komend znajdują się polecenia wprowadzania danych (scanf). Wtedy to informacje te są wypisywane na ekran dopiero po przejściu bloku z scanf. Obsługa samych funkcji MPI_Send, MPI_Recv i MPI_Bcast jest bardzo intuicyjna, a wręcz łatwa i przypomina działanie funkcji obsługujących sockety.