Descargar

Introducción a MPI (página 2)

Enviado por Pablo Turmero


Partes: 1, 2
edu.red

En FORTRAN será vía el llamado a subrutinas: call MPI_ROUTINE (ARGUMENTOS, IERROR)

En C el uso será de la forma: MPI_Xxxxxx(argumentos) El primer paso será invocar a la biblioteca adecuada (C: mpi.h, F: mpif.h)p.e.: #include "mpi.h" Todo programa MPI tiene que ser inicializado y finalizado (para liberar correctamente los recursos). ¿¿Cómo funciona??

edu.red

Versión Fortran PROGRAM simple include 'mpif.h' integer errcode ! Inicializar MPI call MPI_INIT (errcode) ! Parte Principal del Prog… ! Terminar MPI call MPI_FINALIZE (errcode) end Versión C #include "mpi.h" /* Headers */ main(int argc, char **argv) { /* Inicializar MPI */ MPI_Init (&argc, &argv); /* Parte principal del Prog….. */ /* Terminar MPI */ MPI_Finalize (); exit (0); } Un programa MPI: el esquema básico

edu.red

Los siguientes pasos son definir un comunicador, indicar el número total de procesadores en el sistema y el rango de cada uno dentro del conjunto. El comunicador típico es MPI_COMM_WORLD (definido en mpi.h/mpif.h): son todos los nodos requeridos al sistema. (Pueden definirse otros comunicadores si es necesario)

edu.red

"Hola Mundo" en FORTRAN con MPI PROGRAM main include 'mpif.h' integer errcode, rank, size call MPI_INIT (errcode) call MPI_Comm_rank (MPI_COMM_WORLD, rank, errcode) call MPI_Comm_size (MPI_COMM_WORLD, size, errcode) print*, "Hola Mundo! Soy el proceso", rank, " de", size call MPI_FINALIZE (errcode) end

edu.red

"Hola Mundo" en C con MPI #include "mpi.h" #include < stdio.h> int main(int argc, char **argv) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); printf( "Hola Mundo! Soy el proceso %d de %dn", rank,size); MPI_Finalize (); exit (0); }

edu.red

¿Qué es un mensaje? Son paquetes de datos que se intercambian entre los diferentes subprogramas. Un mensaje se compone de: datos + direccionamiento: Punto de origen de los datos Tipo de datos a intercambiar Longitud de los datos a intercambiar Destino (u origen) Una etiqueta que lo distinga Comunicador Intercambio de Mensajes

edu.red

Tipos de Datos El usuario puede construir otros tipos de datos. MPI soporta arquitecturas heterogéneas, la definición del tipode datos a intercambiar hace que sean compatibles.

edu.red

Comunicaciones Punto a Punto Es la forma mas simple de transmisión de mensajes Un proceso envia un mensaje a otro Existen diferentes formas de hacerlo (sincrónicamente, asincrónicamente, bloqueante, no bloqueante, etc).

edu.red

Ejemplo Quiero calcular ?como :

edu.red

double precision mypi, pi, h, sum, x, f, a integer n, myid, size, i, rc, ierr, status c — funcion a integrar f(a) = 4.d0 / (1.d0 + a*a)

c — Numero de intervalos read(5,*) n

c — tamaño del intervalo h = 1.0d0/n

c — realiza las sumas sum = 0.0d0 do i = 1, n x = h * (dble(i) – 0.5d0) sum = sum + f(x) enddo mypi = h * sum

pi=mypi write(6, '(" pi es aproximadamente:", F18.16)') pi

end

edu.red

include 'mpif.h' double precision mypi, pi, h, sum, x, f, a integer n, myid, size, i, rc, ierr, status c — funcion a integrar f(a) = 4.d0 / (1.d0 + a*a) call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr ) print *, "Proceso ", myid, " de ", size, " funcionando" if(myid.eq.0) then read(5,*) n endif if(myid.eq.0) then do i=1,size-1 call MPI_SEND(n,1,MPI_INTEGER,i,1,MPI_COMM_WORLD,ierr) enddo else call MPI_RECV(n,1,MPI_INTEGER,0,1,MPI_COMM_WORLD,status,ierr) endif h = 1.0d0/n

edu.red

sum = 0.0d0 do i = myid+1, n, size x = h * (dble(i) – 0.5d0) sum = sum + f(x) enddo mypi = h * sum if(myid.eq.0) then pi=mypi do i=1,size-1 call MPI_RECV(mypi,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,MPI_ANY_TAG, MPI_COMM_WORLD,status,ierr) pi=pi+mypi enddo else call MPI_SEND(mypi,1,MPI_DOUBLE_PRECISION,0,99, MPI_COMM_WORLD,ierr) endif if (myid .eq. 0) then write(6, '(" pi es aproximadamente:", F18.16)') pi endif call MPI_FINALIZE(rc) end

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente