¡MPI en Acción!

Anuncio
M.A.
Rodríguez‐Meza
Ins$tuto
Nacional
de
Inves$gaciones
Nucleares
Correo
electrónico:
mar@nuclear.inin.mx
h<p://www.astro.inin.mx/mar
¡MPI en Acción!
18/08/09
UAEH
1
•  Un
ambiente
para
el
envio
de
mensajes
2
1. 
MPI_Abort(comm, errorcode)
–
Aborta
la
ejecuación
del
ambiente
MPI.
2. 
MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm) –
Combina
los
valores
de
todos
los
procesos
y
distribuye
el
resulta
hacia
todos
los
procesos.
3. 
MPI_Barrier(comm)
–
Bloquea
hasta
que
todos
los
procesos
alcanzan
esta
ruRna.
4. 
MPI_Bcast(buffer, count, datatype, root, comm) –
Envia
un
mensaje
del
proceso
con
rango
“root”
a
todos
los
otros
procesos
de
el
grupo.
5. 
MPI_Comm_rank(comm, rank) –
Determina
el
rango
del
proceso
que
invoca
en
el
comunicador.
6. 
MPI_Comm_size(comm, size) –
Determina
el
tamaño
de
el
grupo
asociado
con
el
comunicador.
7. 
MPI_Finalize()
–
Termina
el
ambiente
de
ejecución
MPI.
8. 
MPI_Init(argc, argv) –
Inicializa
el
ambiente
de
ejecución
MPI.
9. 
MPI_Recv(buf, count, datatype, source, tag, comm, status) –
Recepción
básica.
10.  MPI_Reduce(sendbuf, recvbuf, count, datatype, op, root, comm) –
Reduce
los
valores
en
todos
los
procesos
a
un
sólo
valor.
11.  MPI_Send(buf, count, datatype, dest, tag, comm) –
Realiza
el
envio
básico.
12.  MPI_Wtime() –
Regresa
el
Rempo
transcurrido
en
el
proceso
que
invoca.
3
¡Hola
mundo!
#include <stdio.h>
#include <mpi.h>
Int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
fprintf(stdout, “\n\n¡hola mundo!\n\n”);
fflush(stdout);
MPI_Finalize();
return 0;
}
4
#include <stdio.h>
int main(int argc, char **argv)
{
float integral, a, b, h, x;
int n, i;
float f(float x);
fprintf(stdout, "\nDame los valores de a, b y n\n");
scanf("%f %f %d", &a, &b, &n);
h=(b-a)/n;
integral = (f(a)+f(b));
x=a;
for (i=1; i<=n-1; i++) {
x=x+h;
integral += f(x);
}
integral = integral*h;
fprintf(stdout,"Con %d trapecios, el área calculada es: %g\n\n", n, integral);
fflush(stdout);
return 0;
}
float f(float x)
{
float valor;
valor = x*x;
return valor;
}
5
int main(int argc, char **argv)
{
int pid, np;
float integral, a=0.0, b=1.0, h, total;
int n=2048, i;
float local_a, local_b, local_n;
int emisor, dest=0, tag=0;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &pid);
MPI_Comm_size(MPI_COMM_WORLD, &np);
h=(b-a)/n;
local_n = n/np;
local_a = a + pid * local_n * h;
local_b = local_a + local_n * h;
integral = integral_local(local_a, local_b, local_n, h);
if (pid == 0) {
total = integral;
for (emisor=1; emisor<np; emisor++) {
MPI_Recv(&integral, 1, MPI_FLOAT, emisor, tag, MPI_COMM_WORLD, &status);
total += integral;
}
} else {
MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);
}
if (pid == 0) {
fprintf(stdout,"Intervalo: [%g, %g] utilizando %d trapecios, %s %g\n\n",
a, b, n, "el área estimada es:", total);
fflush(stdout);
}
MPI_Finalize();
return 0;
}
6

Descargar