Documente Academic
Documente Profesional
Documente Cultură
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ă.
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;
}