La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Taller de MPI.

Presentaciones similares


Presentación del tema: "Taller de MPI."— Transcripción de la presentación:

1 Taller de MPI

2 Modelos de Computación Paralela
1. Multiprocesadores de Acceso Uniforme a Memoria Mecanismo de switches o Bus . . . CPUs . . . . . . Bancos de Memoria Dispositivos de I/O 2. Multiprocesadores de Acceso No uniforme a Memoria Memorias Locales . . . CPUs Mecanismo de Enrutamiento

3 Modelos de Computación Paralela
3. Máquinas con Memoria Compartida Distribuida Mecanismo de interconexión . . . Memoria Compartida Local

4 Plataforma de CeCalCULA
Scalable Power Parallel System (SP2/IBM) Multicomputador MIMD Basado en AIX/6000 (Power2) 16 nodos por Modulo [1 Módulo, 8 Nodos,64 MB c/u, 2 GB c/u], hasta 8 Módulos (128 Nodos) Switch de alta eficiencia Omega (2x2 Crossbar switches) Múltiples etapas con buffer Packet-Switch

5 Plataforma de CeCalCULA

6 Plataforma de CeCalCULA
SGI Origin 2000 Multicomputador MIMD de Memoria Compartida Distribuida (MCD) Basada en el R10000 2 procesadores por nodo (máximo 128 procesadores) [2 Nodos, 128 MB c/u, 9 GB c/u] Conectados por una fibra de interconexión HUB. Controlador de la MCD

7 Plataforma de CeCalCULA

8 Contenido Generalidades Inicialización y finalización de MPI
Comunicaciones Punto a punto Colectivas Operaciones Globales Síncronas/Asíncronas Transferencia de datos dispersos (no homogéneos) Comunicadores y Grupos Topologías

9 MPI (Message Passing Interface)
Estándar que define un sistema de pase de mensajes diseñado para ser utilizado en cualquier sistema paralelo (MPP,redes de estaciones de trabajo, etc.). Portátil, eficiente y flexible. No difiere demasiado de las herramientas de pase de mensajes de mayor uso. (PVM, P4, Express, etc.)

10 Implementaciones MPI MPICH (MPI/Chamaleon). Argonne (USA) LAM (Local Area Multicomputer). Ohio Chimp (Common High-level Interface to Message Passing). CCP de Edinburgo Unify. Combina PVM y MPI. Mississipi MPICH/NT, WIN32MPI,WinMPI MPI-FM. SPARCStation con Myrinet Origin2000. SGI Futjitsu AP1000 CRI/EPCC (Cray/T3D) MPI- POE (IBM SP1/2)

11 Generalidades MPI mueve datos entre las memorias de los elementos de procesamiento (PE) Todos los PEs ejecutan el mismo código (SPMD) MEM. PE 1 2 3 Interconexión

12 Vocabulario Elemento de Procesamiento (PE) Punto a Punto Colectivas
Bloqueado Buffer Rank

13 Convenciones MPI Fortran: Definiciones (Constantes, tipos, rutinas, etc.) en el archivo mpif.h Sintaxis: call MPI_OPERATION(....,ierr) C: Definiciones (Constantes, tipos, rutinas, etc.) en el archivo mpi.h Sintaxis: ierr = MPI_Operation(....) Primer carácter en mayúscula

14 Inicialización Todos los programas MPI necesitan las instrucciones de inicialización y finalización. Necesitan saber el número de PEs (nPEs) y su propio número (Rank) El grupo inicial de PEs esta definido por el parámetro: MPI_COMM_WORLD El número que tiene un PE esta en el rango de 0 a nPEs - 1

15 Inicialización (Cont.)
#include <mpi.h> /* Inicializando MPI */ MPI_Init(&argc,&argv); /* Cuántos PEs Hay ? */ ierr = MPI_Comm_size(MPI_COMM_WORLD,&nPEs); /* Cuál nodo soy yo (Cuál es mi Rank ) ? */ ierr = MPI_Comm_rank(MPI_COMM_WORLD,&iam); MPI_Finalize(); ....

16 Inicialización (Cont.)
Fortran include ‘mpi.h’ c Inicializando MPI call MPI_INIT(ierr) c Cuántos PEs Hay ? call MPI_COMM_SIZE(MPI_COMM_WORLD,&nPEs,ierr) c Cuál nodo soy yo (Cuál es mi Rank ) ? call MPI_COMM_RANK(MPI_COMM_WORLD,&iam,ierr) call MPI_Finalize(ierr) ....

17 Ejercicio: Hola Mundo Escriba una versión paralela para el programa Hola Mundo Iniciar MPI Imprimir el mensaje: Hola Mundo, número del proceso y total de procesos. Finalizar MPI

18 Compilando con MPI

19 Ejecutando un programa

20 Comunicaciones Definiciones
Los bytes son transferidos de un procesador a otro Se debe especificar el destino/fuente, dirección de los datos (buffer), número de elementos, tipo de datos, identificador del mensaje (denominado tag), etc. Envío síncrono: La llamada no retorna hasta que el mensaje es enviado. Envío asíncrono: La llamada retorna inmediatamente, idealmente, el envío ocurre durante otro cálculo. Recepción síncrona: La llamada no retorna hasta tanto no se reciba el mensaje. Recepción asíncrona: La llamada retorna inmediatamente. Cuando se necesitan los datos, se debe llamar a una subrutina de espera. Las comunicaciones asíncronas intentan solapar las comunicaciones con los cálculos.

21 Envío Síncrono Envío de mensaje con bloqueo
ierr = MPI_Send(&buffer,count, datatype, destination, tag, communicator); Fortran call MPI_SEND(&buffer,count, datatype, destination, tag, communicator,ierr); La ejecución se bloquea hasta que el mensaje este en el canal

22 Parámetros del MPI_Send
buffer: Dirección de inicio de los datos count: Longitud del arreglo fuente (número de elementos) datatype: Tipo del dato. (caracter, entero, real, etc.) destination: Número lógico del proceso destino. Tag: Tipo del mensaje (Número entero) communicator: Conjunto (grupo) de procesos al que pertenecen el enviador y el receptor. ierr: Resultado del envío.

23 Recepción Síncrona Recepción de mensajes con bloqueo C
ierr = MPI_Recv(&buffer,count, datatype, source, tag, communicator, &status); Fortran call MPI_RECV(buffer,count, datatype, source, tag, communicator, status, ierr);

24 Tipos de datos en MPI Algunos tipos de datos de MPI, definidos en el archivo mpi.h, son: Tipo de dato MPI Tipo de dato C MPI_CHAR signed char MPI_SHORT signed short int MPI_INT signed int MPI_LONG signet long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNISIGNED_LONG unsigned long int MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_BYTE MPI_PACKED

25 Tipos de datos en MPI (Cont.)
Tipos de datos de MPI, definidos en el archivo mpif.h: Tipo de dato MPI Tipo de dato Fortran MPI_INTEGER INTEGER MPI_REAL REAL MPI_DOUBLE_PRECISION DOUBLE PRECISION MPI_COMPLEX COMPLEX MPI_LOGICAL LOGICAL MPI_CHARACTER CHARACTER MPI_BYTE MPI_PACKED

26 Wildcards Permiten recibir cualquier tipo de mensaje desde cualquier fuente Ejemplo en Fortran: integer status(MPI_STATUS_SIZE) call MPI_RECV(buffer,count, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,status,ierr)

27 El parámetro status El parámetro status retorna información adicional
Parámetros de alguna rutina MPI Información adicional de los errores Información cuando se usan wildcards Declaración en C: Es una estructura predefinida MPI_Status status; Declaración en Fortran: Se usa un arreglo INTEGER status(MPI_STATUS_SIZE)

28 Información en status El tipo (tag) del mensaje recibido
C: status.MPI_TAG Fortran: status(MPI_TAG) La número del enviador (Fuente) C: status.MPI_SOURCE Fortran: status(MPI_SOURCE) El código de error de la llamada MPI C: status.MPI_ERROR Fortran: status(MPI_ERROR)

29 Las seis rutinas MPI !!! Inicializar Número de Procesos
C: ierr = MPI_Init(&argc,&argv); Fortran: call MPI_INIT(ierr) Número de Procesos ierr = MPI_Comm_size(MPI_COMM_WORLD,&npes); Identificador del Proceso ierr = MPI_Comm_rank(MPI_COMM_WORLD,&iam); Envio de mensajes ierr = MPI_Send(buffer,count,datatype,destination,tag,communicator) Recibir Mensajes ierr = MPI_Recv(buffer,count,datatype,source,tag,communicator,estado) Finalizar ierr = MPI_Finalize()

30 Medición del tiempo Reloj MPI_Wtime
MPI_WTIME retorna un número real que contiene los segundos que han transcurrido desde algún tiempo pasado. C float time_now; time_now = MPI_Wtime(); Fortran DOUBLE PRECISION time_now time_now = MPI_WTIME() Parámetros: NINGUNO

31 Ejercicio: Hola Maestro
Escriba un programa paralelo donde cada proceso, excepto el 0, envíe el mensaje: “Hola maestro soy #” (# es el número del proceso) al proceso maestro (proceso 0). El proceso 0 recibirá los mensajes y los mostrará en pantalla . . . 1 N-2 N-1

32 Cada proceso debe escribir su número acompañado del mensaje recibido.
Ejercicio: Saludos Escriba un programa paralelo donde cada proceso envíe su número al vecino sucesor. 1 N-2 N-1 . . . Cada proceso debe escribir su número acompañado del mensaje recibido.

33 Ejercicio: Producto Punto
Escriba un programa paralelo para calcular el producto escalar de dos vectores. Divida los vectores A y B entre el número de procesadores (procesos). Cada proceso calcula el producto punto parcial Sume los productos puntos parciales para obtener el global. 1 N-2 N-1 . . .

34 Transferencia de datos entre múltiples procesos
Comunicaciones Colectivas Transferencia de datos entre múltiples procesos Acciones Colectivas: Sincronizar. Mover datos (difundir, recolectar y esparcir). Calcular Colectivamente.

35 Todos los procesos llaman a la rutina.
Sincronizar Todos los procesos llaman a la rutina. La ejecución es bloqueada hasta que todos los procesos ejecuten la rutina. C ierr = MPI_Barrier(communicator); Fortran call MPI_BARRIER(communicator,ierr)

36 Un proceso envía un mensaje (root).
Difundir Un proceso envía un mensaje (root). Todos los otros reciben el mensaje. La ejecución se bloquea hasta que todos los procesos ejecuten la rutina. Automáticamente actúa como punto de sincronización. C ierr = MPI_Bcast(&buffer,count,datatype, root,communicator); Fortran call MPI_Bcast(buffer,count,datatype,root, communicator,ierr);

37 Intercambio global de datos
Recolectar Intercambio global de datos Cada proceso envía diferentes datos al proceso principal (root) y este los agrupa en un arreglo. C ierr = MPI_ Gather(sbuf,scount,stype,rbuf,rcount, rtype,root,communicator); Fortran call MPI_GATHER(sbuf,scount,stype, rbuf, rcount,rtype,root, communicator, ierr)

38 Recolectar . . . MPI_ Gather(sbuf,scount,stype, rbuf,rcount, rtype,
En PE= root 1 2 ... scount sbuf PE0 PE1 PE2 rcount rbuf . . . De PE 0 De PE 1 De PE 2 MPI_ Gather(sbuf,scount,stype, rbuf,rcount, rtype, root,communicator);

39 Intercambio global de datos
Esparcir Intercambio global de datos El proceso principal (root) rompe un arreglo de datos y envíe las partes a cada procesador. C ierr = MPI_ Scatter(sbuf,scount,stype,rbuf,rcount, rtype,root,communicator); Fortran call MPI_SCATTER(sbuf,scount,stype, rbuf, rcount,rtype,root, communicator, ierr)

40 Esparcir . . . . . . MPI_ Scatter(sbuf,scount,stype,
Hacia PE 1 Hacia PE 2 En PE= root 1 2 ... scount sbuf Hacia PE 0 . . . 1 2 ... rcount rbuf PE0 1 2 ... rcount rbuf PE1 1 2 ... rcount rbuf PE2 . . . MPI_ Scatter(sbuf,scount,stype, rbuf,rcount, rtype, root,communicator);

41 Cálculos Colectivos Definiciones
El usuario puede combinar cálculos parciales de todos los procesos. Los resultados están disponibles en un proceso particular o en todos los procesos. Ejecución sincronizada.

42 Combinación de resultados parciales
Cálculos Colectivos Combinación de resultados parciales El proceso principal (root) recibe los cálculos parciales y los combina usando la operación indicada. C ierr = MPI_ Reduce(sbuf,rbuf,count,datatype, operation, root, communicator); Fortran call MPI_REDUCE(sbuf, rbuf,count,datatype, operation, root, communicator,ierr); Todos almacenan el resultado con : MPI_ Allreduce La rutina no requiere el parámetro root

43 Tipos de Operaciones MPI_MAX Máximo MPI_MIN Mínimo MPI_PROD Producto
MPI_SUM Suma MPI_LAND Y Lógico MPI_LOR O Lógico MPI_LXOR O Exclusivo lógico MPI_BAND Y bit a bit MPI_BOR O bit a bit MPI_BXOR O Exclusivo bit a bit MPI_MAXLOC Máximo y localización MPI_MINLOC Mínimo y localización

44 El usuario puede definir sus propias operaciones
Definición de operaciones El usuario puede definir sus propias operaciones C void function(void *invec,void *inout,int *len, MPI_Datatype *datatype) { Cuerpo de la función } .... int commute; MPI_Op op; ierr = MPI_ Op_create(function,commute,&op); ierr=MPI_Op_free(&op); {op = MPI_OP_NULL}

45 Definición de operaciones
Fortran FUNCTION function(invec(*), inout(*),len,datatype) <type> invec(len), inout(len) INTEGER len, datatype { Cuerpo de la función } .... EXTERNAL FUNCTION LOGICAL COMMUTE INTEGER OP,IERROR call MPI_ OP_CREATE(FUNCTION,COMMUTE,OP,IERROR); call MPI_OP_FREE(OP,IERROR); {OP = MPI_OP_NULL}

46 Ejemplo para calcular una suma
Cada procesador tiene las variables sum_parcial y suma_global El valor de la suma_global es actualizado en el proceso root. C double suma_parcial, suma_global; suma_parcial = ; ierr = MPI_Reduce(&suma_parcial, &suma_global, 1, MPI_DOUBLE_PRECISION, MPI_SUM, root MPI_COMM_WORLD); Fortran double precision suma_parcial, suma_global suma_parcial = Call MPI_REDUCE(suma_parcial, suma_global, 1, MPI_COMM_WORLD,ierr)

47 Ejercicio: Producto Punto
Utilice rutinas de Comunicación colectiva para modificar el programa producto punto. 1 N-2 N-1 . . . Difunda los vectores Recolecte las sumas parciales

48 Comunicaciones Asíncronas
Envío MPI_Isend Envío no bloqueado (inmediato) C MPI_Request request; ierr = MPI_Isend(&buffer,count, datatype,destination, tag, communicator,request); Fortran INTEGER request call MPI_ISEND(buffer,count, datatype,destination, tag, communicator,request,ierr) Parámetros: Los parámetros son los mismos que para MPI_Send, agregándose el parámetro request que establece un enlace entre la operación de comunicación y un objeto MPI (que esta oculto).

49 Comunicaciones Asíncronas
Recepción MPI_Irecv Recepción sin bloqueo (inmediata) C ierr = MPI_Irecv(&buffer,count, datatype,source, tag, communicator,request); Fortran call MPI_IRECV(buffer,count, datatype,source, tag, communicator,request,ierr) Parámetros: Los parámetros son los mismos que para MPI_Recv, sustituyendose el parámetro status por request para establecer un enlace entre la operación de recepción y un objeto MPI (que esta oculto).

50 Comunicaciones Asíncronas
Espera MPI_Wait Es usada para completar comunicaciones sin bloqueo La finalización de la operación de envío permite al remitente modificar libremente el buffer de envío. La finalización de la recepción indica al destinatario que el buffer de recepción ya contiene el mensaje esperado. C ierr = MPI_Wait(request,status); Fortran call MPI_WAIT(request,status,ierr) Parámetros: request: Enlace con la operación. status: Información de la operación.

51 Comunicaciones Asíncronas
Verificar MPI_Test Prueba si una comunicación sin bloqueo a finalizado El valor de la bandera (flag) indica si el mensaje ha sido transferido C int *flag; ierr = MPI_Test(request,flag,status); Fortran LOGICAL flag call MPI_TEST(request,flag,status,ierr) Parámetros: request: Enlace con la operación. flag: Cierto si la operación se completo. status: Información de la operación.

52 Comunicaciones Asíncronas
Ejemplo para envío no bloqueado que actua como una llamada a MPI_Wait call MPI_ISEND(buffer, count,datatype,dest, tag,com,request,ierr) c Cálculos que no modifican el buffer 10 call MPI_TEST(request,flag,status,ierr) if (.not. flag) go to 10 . . .

53 Comunicaciones Asíncronas
Sincronizar MPI_Barrier Todos los procesos llaman a la rutina. La ejecución es bloqueada hasta que todos los procesos ejecuten la rutina. C ierr = MPI_Barrier(communicator); Fortran call MPI_BARRIER(communicator,ierr)

54 Comunicaciones Asíncronas
Revisión MPI_Probe Permite chequear los mensajes que han llegado. No es necesaria una rutina de recepción. El usuario puede decidir el mecanismo de recepción de los datos. Es útil cuando se necesitan diferentes acciones dependiendo de quién, qué, y cuánto, ha enviado ? hacia este proceso el remitente. C ierr = MPI_Probe(source,communicator,status); Fortran call MPI_PROBE(source,communicator,status,ierr)

55 Comunicaciones Asíncronas
Contar datos MPI_Get_count Retorna el número de elementos recibidos. El parámetro datatype ( tipo de dato) debe coincidir con el argumento de la llamada en la rutina de recepción. C int *count; ierr = MPI_Get_count(status,datatype,count); Fortran INTEGER count call MPI_GET_COUNT(status,datatype,count)

56 Modos de Comunicación Envío Recepción MPI_Recv MPI_Irecv Estándar.
MPI_Send MPI_Isend Con Buffer: Usa un buffer para copiar los datos a enviar. No se requiere recpción para iniciar ni finalizar. MPI_Bsend MPI_Ibsend Síncrono: Debe sincronizarse con alguna recepción para poder finalizar. No la requiere para arrancar. MPI_Ssend MPI_Issend Listo: Requiere una recepción para arrancar. MPI_Rsend MPI_Irsend Envío Recepción MPI_Recv MPI_Irecv

57 Modifique el programa saludos utilizando comunicaciones asíncronas.
Ejercicio: Saludos Modifique el programa saludos utilizando comunicaciones asíncronas. 1 N-2 N-1 . . . Cada proceso debe escribir su número acompañado del mensaje recibido.

58 Transferencia de datos dispersos
Definición de tipos. Tipos de datos adaptados a cada necesidad Empaquetamiento de datos. Buffer continuo con diversos tipos de datos

59 Definición de Tipos de Datos
Elementales. (Enteros, reales, complejos, etc.) Continuos. MPI_Type_contiguous(count,oldtype,newtype) Vector. (Hvector) MPI_Type_vector(count, blength,stride,oldtype,newtype) Indexado. (Hindexed) MPI_Type_indexed(count,array_blength,array_displa,oldtype,newtype) Estructuras. MPI_Type_struct(count,array_blength,array_displa,array_types,newtype) MPI_Type_commit(newtype)

60 Ejemplo Matriz a(100,100) . . . (1,1) (2,2) (3,3) (4,4)

61 Ejemplo (Código C) double a[100][100];
int separacion[100],longbloqs[100],i; MPI_Datatype superior; .... /* Cálculo del inicion y tamaño de cada fila */ for (i=0;i<100;i++) { separacion[i] = 100*i + i; longbloqs[i] ,= i ; } /* Crea el tipo de dato para la parte triangular superior de la matriz */ MPI_Type_indexed(100,longbloqs,separacion,MPI_DOUBLE,&superior); MPI_Type_commit(&superior); /* ... Entonces envía la parte.... */ MPI_Send(a,1,superior,dest,tag,MPI_COMM_WORLD);

62 Ejemplo (Código Fortran)
PARAMETER(n=100) DOUBLE PRECISION a(n,n) INTEGER separacion(n),longbloqs(n),superior,i .... C Cálculo del inicion y tamaño de cada fila do i=1,n separacion(i)= 100*(i-1) longbloqs(i) ,= i enddo C Crea el tipo de dato para la parte triangular superior de la matriz call MPI_TYPE_INDEXED(100,longbloqs,separacion, $ MPI_DOUBLE,&superior,ierr) call MPI_TYPE_COMMIT(&superior,ierr) C Entonces envía la parte.... */ call MPI_SEND(a,1,superior,dest,tag,MPI_COMM_WORLD);

63 Empaquetamiento de datos
MPI_Pack(ibuf,icount,datatype,obuf,osize,pos,comm). Empaqueta datos en un buffer continuo en memoria para ser enviados como un mensaje único. MPI_Unpack(ibuf,isize,pos,obuf,ocount,datatype,comm). Desempaqueta los datos recibidos en un mensaje. MPI_Pack_size(icount,datatype,comm,size). Determina el espacio necesario para empaquetar un mensaje

64 Manejo de Grupos int MPI_Comm_group(comm,&group) int MPI_Group_Size(group,&size) int MPI_Group_rank(group,&rank) int MPI_Group_union(group1,group2,&newgroup) int MPI_Group_intersection(group1,group2,&newgroup) int MPI_Group_difference(group1,group2,&newgroup) int MPI_Group_incl(group,n,ranks,&newgroup) int MPI_Group_excl(group,n,ranks,&newgroup) MPI_Group group,group1,group2,newgroup (C) INTEGER group,group1,group2,newgroup (Fortran)

65 Manejo de Comunicadores
int MPI_Comm_create(comm,group,&newcomm) int MPI_Comm_Size(comm,&size) int MPI_Comm_rank(group,&rank) int MPI_Comm_Dup(comm,&newcomm) int MPI_Comm_split(comm,color,key,&newcomm) int MPI_Comm_free(comm) MPI_Comm comm,newcomm (C) INTEGER comm,newcomm (Fortran)

66 Topologías Cartesianas ( Mallas) Genéricas (Grafos)

67 Topologías Cartesianas
int MPI_Cart_create(comm, ndims,dims,periods,reorder,&newcomm) int MPI_Dims_create(nnodes,ndims,dims) int MPI_Cartdim_get(comm,ndims) int MPI_Cart_get(comm,maxdims,dims,periods,coords) int MPI_Cart_rank(comm,coords,rank) int MPI_Cart_coords(coom,rank,maxdims,coords)

68 Topologías Genéricas int MPI_Graph_create(comm, nnodes, index, edges, reorder, &comm_grap) int MPI_Graphdims_get(comm,nnodes,nedges) int MPI_Graph_get(comm,maxindex,maxedges,index,edges) int MPI_Graph_neighbors_count(comm,rank,nneighbors) int MPI_Graph_neighbors(comm,rank,maxneighbors,neighbors)


Descargar ppt "Taller de MPI."

Presentaciones similares


Anuncios Google