Sunteți pe pagina 1din 3

Standardul MPI

Message Passing Interface(MPI) este un standard bazat pe consensul MPI Forum, cu peste 40
de organizații participante, incluzând vendori, cercetători, dezvoltatori software pentru
biblioteci și chiar utilizatori. MPI este o specificație pentru dezvoltatori și utilizatorii
bibliotecilor de transmitere de mesaje. De sine stătător nu este o bibliotecă, ci mai degrabă o
specificație a unei astfel de biblioteci. MPI adresează în principal modelul de transmitere a
mesajelor în programare paralelă(message-passing parallel programming model): datele sunt
mutate de din zona de adrese a unui proces în zona de adrese a altui proces prin acțiuni
cooperative a ambelor procese.
Cu alte cuvinte, scopul Message Passing Interface este să ofere un standard larg folosit pentru
a scrie programe de transmitere de mesaje. Scopul acesteia este de a fi practică, eficientă, să
ofere portabilitate și flexibilitate programatorilor.

Model de programare

Inițial, MPI a fost conceput pentru arhitecturi cu memorie distribuită, care căpătau popularitate
în anii 1980 și începutul anilor 1990. După cum trendurile arhitecturale s-au schimbat masiv,
arhitecturile cu memorie partajată au fost combinate cu rețele de calculatoare, fiind create astfel
sisteme hibride cu memorie distribuită/ partajată.
Astăzi, MPI rulează virtual pe orice platformă hardware sub formă de memorie distribuită,
partajată și hibridă.
Modelul de programare rămâne totuși în mod clar cu memorie distribuită, fără a ține cont de
arhitectura hardware a mașinii pe care este rulează.

Motive pentru a folosi MPI


● standardizare - MPI este singurul complex de biblioteci de transmitere de mesaje care
poate fi considerat un standard.
● portabilitate - Fie este o foarte mică necesitate a modificare a codului sursă, fie nu este
chiar deloc nevoie de a aduce modificări la portarea de la o platformă la alta pentru
standardul MPI.
● oportunități de a performa - implementările furnizorilor sunt capabile să exploateze la
maximum resursele hardware pentru perfomanță sporită
● fucționalitate - există peste 430 de rutine definite în MPI-3. Majoritatea programelor
MPI pot fi scrise folosind poate o duzină de rutine.
● disponibilitate - o varietate de implementări sunt disponibile, fie enterprise sau open
source.

COD SURSĂ
#include <stdio.h>
#include <mpi.h>
float f(float x){
return x*x;
}
float Trap(float a, float b, int n, float h){
float integral;
float x;
int i;
integral = (f(a)+ f(b))/2.0;
x = a;
for (i = 1;i <= n-1; i++){
x = x + h;
integral = integral +f(x);
}
return integral*h;
}
int main(int argc, char** argv){
int my_rank;
int p;
float a = 0.0;
float b = 1.0;
int n = 1024;
float h;
float local_a;
float local_b;
int local_n;
float integral;
float total = -1;
int source;
int dest = 0;
int tag = 0;
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
MPI_Comm_size(MPI_COMM_WORLD,&p);
printf("%d\n",my_rank );
h = (b-a)/n;
local_n = n/p;

local_a = a + my_rank*local_n*h;
local_b = local_a +local_n*h;
integral = Trap(local_a, local_b, local_n, h);
if (my_rank == 0){
total = integral;
for(source = 1; source < p; source++){
MPI_Recv(&integral, 1, MPI_FLOAT, source, tag,
MPI_COMM_WORLD, &status);
printf("PE %d <-%d,%f\n", my_rank, source, integral);
total = total + integral;
}
}
else{
printf("PE %d -> %d, %f\n",my_rank, dest, integral);
MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);
}
if (my_rank == 0)
{
printf("With n = %d trapezoids, our estimate\n", n);
printf("of the integral from %f to %f = %f\n", a, b ,total);
}
MPI_Finalize();
return 0;
}

S-ar putea să vă placă și