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