Cada procesador corre un programa Todas las variables son privadas La comunicacin se realiza a travs de subrutinas especiales Trans-mensajes Qu es MPI? Es una implementacin de un estndar del modelo de paso de mensajes
Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos?
Los datos se comparten por medio del paso de mensajes
Consiste en una serie de libreras C
MPI (Message Passing Interface) Una coleccin de rutinas adecuadas para facilitar la comunicacin (intercambio de datos y sincronizacin de tareas) entre distintos procesadores. MPI : 1994 / MPI 2 : 1997 Existen bibliotecas para C y Fortran (C++ y F90). Caractersticas: Es estndar (por consenso, no por normativa) Portable Flexible (~ 125 rutinas) y expandible Simple (con las 6 rutinas bsicas se puede hacer mucho!) Qu es MPI? Caractersticas de MPI Principalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava
Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario
Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos
En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente
Necesidad de recursos que no estn garantizados por la implementacin MPI
NO ES PORTABLE TOTALMENTE Portabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI
Suponer buffering. No asumir que el envo de datos es tipo buffer
Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera)
Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibir Local Area Multiprocesor (LAM) Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet
Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM Local Area Multiprocesor (LAM) MPICH y MPICH2 MPICH2 es una implementacin (bastante) portable de alta performance del standart MPI (-1 y -2) Principales logros: 1) provee una implementacin MPI soportada en una gran variedad de plataformas HETEROGENEAS. Con gran variedad de redes (10Gigabits, Infiniband, Myrinet, Quadrics ) y tiene algunas cosas interesantes para su mejor funcionamiento en sistemas propietarios como BlueGene, Cray, etc
2) Es fcil de utilizar en otros entornos derivados lo que permite ampliar sus capacidades enormemente. Por ejemplo crear nuestra librera, o Petsc, o scalapack Como funcionan? Se debe compilar con las librerias adecuadas.
mpicc -o s.exe sistema.c -lm
Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe Como funciona MPI? En FORTRAN ser va 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). Versin 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 Versin 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 bsico Prog.Basico Como funciona MPI? Los siguientes pasos son definir un comunicador, indicar el nmero total de procesadores en el sistema y el rango de cada uno dentro del conjunto. El comunicador tpico es MPI_COMM_WORLD (definido en mpi.h/mpif.h): son todos los nodos requeridos al sistema. (Pueden definirse otros comunicadores si es necesario) Comunicador Comunicadores A cada proceso se le asigna un numero (rank) consecutivo empezando desde 0
Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su rank sera diferente en cada uno de ellos
MPI_COMM_WORLD es un comunicador que engloba a todos los procesos
Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tipos Comunicadores Para recibir un mensaje no siempre es necesario especificar el rank de la fuente aunque si lo es para enviarlo
context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente
MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro
MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padre Inicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct Clases de llamadas MPI Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard no hay garanta de que el recv se inicio synchronous se completa cuando el recv comenz. buffered Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready El usuario dice cuando se completo la recepcin
Los recv son mas sencillos: Se completan cuando el data esta listo para usarse Comunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm);
MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status);
buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin Comunicacin punto a punto Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a punto Comunicacin colectiva Operacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo
MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm);
buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica
MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com);
sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcin Comunicacin colectiva Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank
MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo
MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Comunicacin colectiva 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 %d\n, rank,size); MPI_Finalize (); exit (0); } Hola Mundo C #define CONMPI #ifdef CONMPI #include "mpi.h" #endif
FINALIZE #ifdef CONMPI MPI_Finalize(); #endif Mido tiempos, imprimo en rank cero, libero memoria en rank cero y finalizo Mediciones de eficiencia y escalabilidad Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta!
Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad Mediciones Referencias Bibliografia en la pagina de la materia