PR lab 1

Programowanie rozproszone

Laboratorium 1

Cel

Celem laboratorium było opanowanie programowania z przesyłaniem komunikatów za pośrednictwem biblioteki MPI.

  1. Kody źródłowe

    1. Program 1 – sczytywanie i propagacja liczby na wszystkie węzły

#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);

}

    1. Program 2 – sczytywanie i propagacja liczby w konwencji pierścienia

#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);

}

  1. Przykłady działania

    1. Program 1

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

Program 2

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

Wnioski

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.


Wyszukiwarka

Podobne podstrony:
PR lab 3
PR lab 4
PR lab 2
PR LAB Cw4 Kinematyka prędkości i przyśpieszeń
PR lab 5
PR lab 3
PR LAB Cw4 Kinematyka prędkości i przyśpieszeń
Pr 1st 1 1 m01 lab id 382178 Nieznany
gri2 lab cwiczenia z podstaw pr Nieznany
[PKC][LAB][Ostatnia laborka][Pr Nieznany
statyczna pr rozcia, Budownictwo pcz, referaty wytrzymka lab
Lab 1 wyznaczanie pr śr
Pr 1st 1 1 m12 lab
spis lab I sem 2010
PR CYW PR ROP WYKLAD 26
Stany nagle w położnictwie PR
Pr UE Zródła prawa (IV 2013)
III WWL DIAGN LAB CHORÓB NEREK i DRÓG MOCZ
PR CYW PR ROP WYKLAD 28

więcej podobnych podstron