GRID Computing CARTIF 06 Junio 2007, Valladolid Introducción a MPI David Rodríguez González Consejo Superior de Investigaciones Científicas Instituto de Física de Cantabria, IFCA  (Centro Mixto CSIC-Universidad de Cantabria) Santander  ESPAÑA
Contenido Introducción Modelos de computación: HTC y HPC Computación paralela Paradigma de paso de mensajes El estándar MPI Tipos de comunicación Funciones básicas y tipos de datos Algunas implementaciones Introducción a la programación en MPI Compilar y ejecutar programas MPI con MPICH Obtención de información e intercambio de mensajes MPICH-G2 Ejecución de programas en el grid Una aplicación más compleja en grid (ANN). Open MPI
INTRODUCCION
HTC y HPC High throughput computing (HTC). Se utilizan grandes cantidades de recursos computacionales durante largos periodos de tiempo.  Lo importante es conseguir una gran cantidad de tiempo de cpu de media durante mucho tiempo, no la respuesta rápida. Se lanzan muchos trabajos independientes, y se trata de optimizar el número de trabajos ejecutados por unidad de tiempo. Colas tipo Condor, PBS, LSF… Ejemplo: simulación de sucesos en colisionadores de altas energías. High performance computing (HPC). Consiste en lograr disponer durante un periodo de tiempo corto de una gran cantidad de recursos computacionales. Lo importante es que la aplicación se ejecute en el menor tiempo posible. Aplicaciones paralelas. Ejemplo:  entrenamiento distribuido de una red neuronal artificial.
Computación paralela La que se realiza usando procesos separados. Interactúan intercambiando información. Existen diversos tipos de computación paralela. Todas usan distintos datos en cada proceso: Paralelismo en los datos (“data-parallel”):  Mismas operaciones en datos distintos. También llamado  SIMD (Single Instruction Multiple Data) . Máquinas vectoriales. SPMD:  Mismo programa, datos distintos. MIMD:  Programas y datos diferentes.  SPMD y MIMD son esencialmente lo mismo porque cualquier programa MIMD puede implementarse como SPMD.  MPI se utiliza principalmente para SPMD/MIMD. HPF (High Performance Fortran) es un ejemplo de una interfaz de programación SIMD.
¿Por qué es necesaria la computación paralela? Límites físicos en la mejora de las máquinas. Los sistemas de alto rendimiento especializados resultan muy caros. La computación paralela en clusters de PCs resulta más asequible. Y hace más fácil compartir los recursos (como en el grid). Muchos problemas pueden ser resueltos mucho más rápidamente gracias a la paralelización. Sin embargo, esta no es siempre una buena solución, depende mucho del tipo de problema a resolver.
Speedup “ Speedup”: es la medida de la mejora que se consigue al ejecutar un programa o algoritmo en varios procesadores de forma paralela, con respecto a lo que se tarda en un sistema uniprocesador.  Entonces el  speedup  S es el cociente entre el tiempo secuencial t s  y el tiempo en n procesadores t n :   S = t s /t n Pero hay que tener en cuenta que no todo el código de un programa es paralelizable.  Ley Amdahl: da un límite para el  speedup S = (t s  + t n )/(t s  + t n /n)
EL ESTÁNDAR MPI
Paradigma de paso de mensajes Probablemente más extendido hoy día en programación de aplicaciones paralelas. Consiste en una serie de procesos que interactúan por medio de mensajes.  Cada proceso puede ejecutar código distinto y sobre diferentes datos. El modelo de paso de mensajes es valido tanto para sistemas de memoria compartida como para sistemas de memoria distribuida (cluster & grid computing). El intercambio de mensajes es cooperativo: los datos deben ser tanto enviados como recibidos explícitamente. Esto supone una ventaja en cuanto a que la modificación en la memoria del proceso es conocida por este.
MPI (Message Passing Interface) Es una interfaz estándar (1993) para la programación usando el paradigma de paso de mensajes.  Sirve tanto para grandes computadores de memoria compartida,  como para clusters o redes de ordenadores heterogéneos (incluido el grid computing). Definida para  C, C++ y FORTRAN. Comprende una gran cantidad de funciones (128), macros, etc. Pero con 6 funciones básicas se puede empezar a programar usando MPI.
Implementaciones de MPI Existen bastantes implementaciones del estándar MPI. Algunas son debidas a proveedores de hardware que las proporcionan (optimizadas) paras sus máquinas (IBM, HP, SGI…), otras son desarrolladas en el ámbito académico. Algunas implementaciones son: MPICH (MPICH 2 implementa MPI2) Disponible para múltiples devices incluido globus2. LAM/MPI OpenMPI  unión de varios proyectos ( FT-MPI ,  LA-MPI ,  LAM/MPI , y  PACX-MPI ) . Más detalles en la charla de Sven Stork el martes.
Uso de MPI Se puede usar MPI para: Programas paralelos “portables”. Librerías paralelas. Programas con relaciones entre datos irregulares o dinámicas que no se ajusten a un modelo de paralelismo en los datos.  Cuando no usar MPI:  Si se puede usar HPF o un programa paralelo Fortran 90. Si se pueden usar librerías de más alto nivel (que pueden haber sido escritas usando MPI). Si no se necesita realmente el paralelismo  
PROGRAMACIÓN MPI
MPI tipos de datos Se definen los siguientes tipos de datos MPI: MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED Corresponde a los de C, pero se añaden el tipo byte, y el empaquetado, que permite enviar simultáneamente datos de distintos tipos.
MPI Funciones básicas  Funciones básicas: MPI_Init => Inicialización de MPI. MPI_Finalize => Termina MPI. MPI_Comm_size => Para  averiguar el número de procesos. MPI_Comm_rank => Identifica el proceso. MPI_Send => Envía un mensaje. MPI_Recv => Recibe un mensaje. Referencia del estándar en  http :// www - unix.mcs.anl.gov / mpi /
Ejemplo Básico: Hola Mundo Escribir y Compilar el programa Hola Mundo usando MPICH. Ejecución en un cluster. Ejecución en el grid.
MPICH MPICH es una implementación gratuita de MPI 1.2 Implementa parte del nuevo estándar MPI-2 MPICH 2 implementa MPI-2 Es una implementación muy “portable”: Supercomputadores de memoria distribuida Sistemas de memoria compartida Clusters Grid Esta se puede compilar para distintos “devices” de comunicación. Consideraremos dos: MPICH-P4 Device ch-p4 dirigido a redes de ordenadores. MPICH-G2 Es una implementación “grid” de MPICH mediante el device globus2 Completamente rediseñada desde la anterior versión MPICH-G http ://www3. niu.edu / mpi /
Escribiendo programas MPI De las seis funciones básicas que mencionamos antes MPI_Init y MPI_Finalize son imprescindibles para que haya un programa MPI. Veamos un ejemplo trivial #include &quot;mpi.h&quot;   #include <stdio.h>  int main( int argc, char **argv )  {  MPI_Init( &argc, &argv );   printf( &quot;Hola Mundo\n&quot; );  MPI_Finalize();  return 0;  }
Programas  MPI (compilación) El programa anterior solo inicializa y termina el entorno MPI.  Entre tanto cada proceso imprime un mensaje por pantalla. Para un programa pequeño como este podemos hacer una llamada directamente al comando de compilación: mpicc (para programas C) mpif77 (Fortran 77). mpif90 (Fortran 90) mpiCC (C++) Para aplicaciones más complicadas conviene usar un Makefile. En nuestro caso anterior (fichero hello.c): mpicc –o hello hello.c
Ejecución de un programa MPI con MPICH El comando mpirun se usa para ejecutar los programas MPI en MPICH. (esto no es parte del estándar) mpirun admite diversas opciones. Destacaremos las siguientes: -np N:  N indica el número de procesos que se quiere en la ejecución del programa. -p4pg pgfile: indica explícitamente las máquinas en las que se quiere correr y el path del programa y usuario que se usará en cada una de ellas. -machinesfile mfile: fichero de máquinas para correr en lugar del estándar (se usa en combinación con –np). Digamos que queremos correr nuestro programa en dos máquinas de la lista estándar: mpirun -np 2 hello
Ejemplo pgfile y machinefile grid079 0 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid079 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid006 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid007 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid008 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid073.ifca.unican.es:2 grid074.ifca.unican.es:2 grid075.ifca.unican.es:2 grid076.ifca.unican.es:2 grid077.ifca.unican.es:2 grid078.ifca.unican.es:2
Grupos y Comunicadores Un  grupo  es un conjunto ordenado de procesos. Cada proceso de un grupo lleva asociado un identificador entero que se suele denominar “rank”.  Un  comunicador  representa una colección de procesos que se pueden comunicar entre sí. Es un objeto con cierto número de atributos, asociado a algunas funciones para crearlos, usarlos y destruirlos. Especifica un dominio de comunicación que puede ser usado tanto en las comunicaciones punto-a-punto como en las colectivas (por los procesos que son parte de él). Evitan que exista comunicación no deseada entre determinados procesos. Contiene un grupo y un contexto
Delimitación del alcance de la comunicación Grupos separados de subprocesos trabajando en diferentes subprogramas. Invocación paralela de librerías paralelas: Los mensajes propios de la aplicación deben mantenerse separados de los de la librería. MPI proporciona grupos de procesos Inicialmente el grupo “all”. Se proporcionan rutinas para la administración de los grupos. Todas las comunicaciones, no solo las colectivas, tienen lugar en grupos. Un grupo (group) y un contexto (context) se combinan en un comunicador (communicator). Fuente y destino en una operación send o receive se refieren al rank en el grupo asociado con un comunicador dado. Se puede usar MPI_ANY_SOURCE en una operación receive.
MPI tipos de comunicación La comunicación MPI entre procesos puede ser de dos tipos: Punto a punto : el proceso “origen” conoce el identificador del proceso “destino” y envía un mensaje dirigido solo a él. Se usan las funciones MPI_Send y MPI_Recv. Colectiva : Operaciones en las que participan todos los procesos de un operador. Ejemplo: “ Broadcast”: El proceso origen manda el mensaje a todos los demas (que pertenezcan al mismo comunicador). Esto es típico de un esquema “master-slave”. Se usa la función MPI_Bcast. Las funciones MPI de recepción de datos son por lo general “bloqueantes”, es decir, un proceso que debe recibir un mensaje espera hasta que de hecho lo ha recibido completo.
Obteniendo información de MPI Usaremos ahora dos más de las seis funciones básicas: MPI_Comm_size y MPI_Comm_rank. Así averiguaremos desde el programa el número de procesos que participan y la identificación de cada uno. int main( argc, 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&quot;, rank, size );  MPI_Finalize();  return 0;  }
Funciones de comunicación MPI A continuación veremos un poco más en detalle las funciones básicas de envío y recepción de mensajes punto a punto y broadcast. MPI_Send MPI_Recv MPI_Bcast  MPI_Reduce Imagen del Tutorial  de Gropp
Sintaxis de MPI_Send y MPI_Recv La operación básica de envío (bloqueante) es: La operación básica de recepción correspondiente: MPI_Recv(start, count, datatype, source, tag, comm, status) MPI_Send( start, count, datatype, dest, tag, comm ) start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato dest: Identificación del proceso destino tag: etiqueta de la comunicación comm: Identificación del comunicador start: puntero para la recepción de los datos count: número de elementos datatype: tipo de dato source: Identificación del proceso origen tag: etiqueta de la comunicación comm: Identificación del comunicador status: puntero para acceso a información sobre mensaje
Ejemplo MPI_Send/MPI_Recv char msg[100]; if(my_rank==0) { sprintf( msg ,&quot;\n\n\t Esto es un mensaje del proceso %d al proceso %d&quot;,source,dest); MPI_Send(msg,100,MPI_CHAR,dest,TAG,MPI_COMM_WORLD); printf(&quot;\n Mensaje enviado a %d&quot;,dest); } else if(my_rank==1) {  MPI_Recv(msg,100,MPI_CHAR,source,TAG,MPI_COMM_WORLD,&status); printf(&quot;\n Mensaje recibido en %d&quot;,dest); printf(msg); }
Adquiriendo información sobre un mensaje MPI_TAG y MPI_SOURCE son usados principalmente cuando hay MPI_ANY_TAG y/o MPI_ANY_SOURCE en la llamada MPI_Recv.  MPI_Get_count se usa para determinar la cantidad de datos de un tipo dado que se han recibido. MPI_Status status;  MPI_Recv( ..., &status ); ... status.MPI_TAG; ... status.MPI_SOURCE; MPI_Get_count( &status, datatype, &count );
Operaciones colectivas Comunicación colectiva: envío de un mensaje de uno a muchos. Se hace con MPI_Bcast (Broadcast) Típicamente un master envía los mismos datos a sus esclavos. Por ejemplo, en la paralelización del entrenamiento de una red neuronal enviamos a todos los esclavos los nuevos pesos al final de cada época de entrenamiento. Operaciones colectivas: se realiza una operación matemática distribuida y se devuelve el resultado al root de la operación También es típico en un esquema master-slave. En la neura se utiliza por ejemplo en la suma de los errores de todos los esclavos. Operaciones definidas:  Aritméticas: suma, multiplicación…  Lógicas: AND, OR…
Operaciones colectivas Imagen del Tutorial  de Gropp
Reduce MPI_MAX  maximum integer, float integer, real, complex  MPI_MIN  minimum integer, float integer, real, complex  MPI_SUM  sum integer, float integer, real, complex MPI_PROD  product integer, float integer, real, complex  MPI_LAND  logical AND integer logical  MPI_BAND  bit-wise AND integer, MPI_BYTE integer, MPI_BYTE  MPI_LOR  logical OR integer logical  MPI_BOR  bit-wise OR integer, MPI_BYTE integer, MPI_BYTE  MPI_LXOR  logical XOR integer logical  MPI_BXOR  bit-wise XOR integer, MPI_BYTE integer, MPI_BYTE  MPI_MAXLOC  max value and location float, double and long double real, complex,double precision  MPI_MINLOC  min value and location float, double and long double real, complex, double precision
Sintaxis de Broadcast y Reduce Broadcast: Reduce: MPI_Bcast(start, count, datatype, root, comm)  MPI_Reduce(start, result, count, datatype, operation, root, comm)  start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato root: identificación del proceso origen comm: Identificación del comunicador start: puntero a los datos a enviar result: puntero para almacenar el resultado count: número de elementos a enviar datatype: tipo de dato operation: identificación de la operación colectiva root: identificación del proceso origen comm: Identificación del comunicador
Reduce Operaciones predefinidas para MPI_Reduce: MPI_MAX máximo MPI_MIN mínimo  MPI_SUM suma MPI_PROD producto  MPI_LAND “and” lógico  MPI_LOR “or” lógico  MPI_LXOR “xor” lógico MPI_BAND “bitwise and”  MPI_BOR “bitwise or”  MPI_BXOR “bitwise xor”  MPI_MAXLOC máximo e índice del máximo MPI_MINLOC mínimo e índice del mínimo Además existe un mecanismo para que el usuario cree sus propias funciones para el “Reduce”.
Ejemplo BroadCast Char  msg[100];  if(my_rank==source) { sprintf(msg,&quot;\n Esto es un mensaje del proceso %d a todos los demás&quot;,sourc e); MPI_Bcast(msg,100,MPI_CHAR,source,MPI_COMM_WORLD); printf(&quot;\n Mensaje enviado a todos desde %d&quot;,source); } else { MPI_Bcast(msg,100,MPI_CHAR,source,MPI_COMM_WORLD); printf(&quot;\n Mensaje recibido en %d desde %d&quot;,my_rank,source); printf(msg); }
Ejemplo Reduce int value; int result; value = my_rank; MPI_Reduce(&value,&result,1,MPI_INT,MPI_SUM,source,MPI_COMM_WORLD); if(my_rank==source) { printf(&quot;\n Resultado de la suma colectiva %d&quot;, result); }
Topologías Una topología es una estructura virtual de procesos MPI. Sirve para contestar a la pregunta ¿Quiénes son mis vecinos? Asocia un esquema de direccionamiento a los procesos de un comunicador. Una topología típica es la cartesiana que consiste en un malla en la que los procesos se identifican mediante dos subíndices. Otro tipo es la topología en grafo que es más genérica. Imagen del Tutorial  de Gropp
Otras características. Extensiones MPI-2 Parallel I/O. Varios procesos de un programa paralelo acceden a datos (lectura o escritura) de un fichero común. Alto rendimiento. DPM (Dynamic Process Management): Permite a un job MPI crear nuevos procesos en tiempo de ejecución y comunicarse con ellos. One sided operations. Remote Memory Access. Puede proporcionar mayor rendimiento sobre todo en redes que soportan nativamente este tipo de comunicaciones (InfiniBand y Myrinet).
MPICH-G2
MPICH-G2 MPI sobre globus2 MPICH-G2 es una implementación “grid enabled” del  estándar MPI 1.2  Por medio del llamado  globus2  device usa los servicios del Globus Toolkit 2 para ejecutar de forma distribuida (en máquinas heterogéneas) aplicaciones paralelas programadas usando MPI. La librería de comunicaciones Nexus de globus define una interfaz de comunicación de bajo nivel que utilizada para dar soporte a un amplio rango de lenguajes y librerías de nivel superior.
Usando MPICH-G2 Requisitos: Certificado de usuario. En cada máquina en que se quiera correr usando mpirun Hay que tener cuenta Debe estar instalado globus y MPICH-G2 Globus gatekeeper Compilación con mpicc, mpif77, etc. Ejecutar la aplicación usando mpirun: Bajo el globus2 device esto genera un RSL Se envía a las máquinas del grid
TRABAJOS PARALELOS EN GRID
MPICH-P4 en grid UI RB CE WN WN WN WN WN WN WN
MPICH-G2 en grid UI RB CE WN WN WN WN WN WN WN CE WN WN WN WN WN WN WN CE WN WN WN WN WN WN WN
JDL Executable  = &quot;hello&quot;; JobType  = &quot;mpich&quot;; NodeNumber  = 8; VirtualOrganisation = &quot;cg&quot;; StdOutput  = &quot;std.out&quot;; StdError  = &quot;std.err&quot;; InputSandbox  = {&quot;hello&quot;}; OutputSandbox  = {&quot;std.out&quot;,&quot;std.err&quot;}; Executable  = &quot;hello.g2&quot;; JobType  = &quot;mpich-g2&quot;; NodeNumber  = 2; VirtualOrganisation = &quot;cg&quot;; StdOutput  = &quot;std.out&quot;; StdError  = &quot;std.err&quot;; InputSandbox  = {&quot;hello.g2&quot;}; OutputSandbox  = {&quot;std.out&quot;,&quot;std.err&quot;}; Rank = other.GlueCEStateFreeCPUs; Para MPICH P4 Para MPICH G2
OPEN MPI
Origen Open MPI es un proyecto que combina los esfuerzos de diversos proyectos anteriores ( FT-MPI ,  LA-MPI ,  LAM/MPI , y  PACX-MPI ) para crear la mejor librería MPI. En 2003 se tomó la decisión de colaborar En 2004 empezó la fase de diseño e implementación La primera versión se hizo público en 2005 Es una implementación de MPI-2 totalmente nueva. Se desarrolla como código abierto por un consorcio de socios de diversos ámbitos (investigación, educación e industria) Página web del proyecto:  http :// www.open - mpi.org /
Objetivos Arquitectura modular Fragmentación y recreación de mensajes Diseñado para entornos heterogéneos: Varias redes Varias arquitecturas de los nodos Detección automática de errores y  retransmisión Portable y con un buen rendimiento Clusters Mainframes Grid Tres capas OMPI : Open MPI ORTE : Open Runtime Environment OPAL : Open Hardware Abstraction layer
Instalación Open MPI usa autotools: ./configure make make install Opciones: Compilación como librería compartida o estática Permitir o no el soporte de “threads” … Los ficheros binarios y librerías deben ser localizables por el sistema $(PREFIX)/bin -> $PATH $(PREFIX)/lib -> $LD_LIBRARY_PATH
Startup Open MPI soporta  mpirun  and  mpiexec ORTE soporta varios mecanismos de arranque de forma nativa rsh/ssh PBS/Torque SLURM Xgrid El mecanismo de arranque puede ser seleccionado
Requisitos Los demonios de orte necesitan un puerto TCP/IP de entrada abierto ssh  necesita poder conectarse sin password (public keys) Open MPI debe estar instalado tanto en el Head Node como en los Computing Nodes
PACX MPI
Introducción Middleware para ejecutar aplicaciones MPI en una red de computadores paralelos Desarrolla originalmente en 1995 (Vector + MPP) Implementación optimizada de MPI que cumple con el estándar.  Las aplicaciones solo necesitan ser recompiladas. PACX-MPI usa las implementaciones locales optimizadas para las comunicaciones el cluster
Diseño PACX-MPI arranca un trabajo MPI en cada cluster Se encarga de controlar estos trabajos creando transparentemente un trabajo MPI mayor. PACX-MPI transforma el rank de este job mayor a los rank de los procesos MPI de los clusters Arranca dos procesos MPI adicionales ocultos para las comunicaciones con el exterior: El rank 0 local es el demonio de comunicación hacia fuera ( out_daemon ) El rank 1 local es el demonio de comunicación hacia dentro ( in_daemon )
Bibliografía MPI Pacheco, P.S.  Parallel Programming with MPI . Morgan Kaufmann Publishers, 1997.  Snir, M. et al.  MPI - The Complete Reference . Volume 1, The MPI Core. The MIT Press, 1998. Gropp, W., Lusk, E. y Skjellum, A.  Using MPI, Portable Parallel Programming with the Message-Passing Interface . The MIT Press, 1994.
Más sobre MPI Tutorial en HLRS: On-line:  http :// www.hlrs.de / organization /par/ par_prog_ws / Otros recursos en el Web: MPI Forum:  http://www.mpi-forum.org/ MPI en Argonne:  http://www-unix.mcs.anl.gov/mpi/ MPICH 1:  http://www-unix.mcs.anl.gov/mpi/mpich1/ MPICH 2  http://www-unix.mcs.anl.gov/mpi/mpich2/ OpenMPI:  http://www.open-mpi.org/ LAM/MPI:  http://www.lam-mpi.org/ PACX MPI:  http:// www.hlrs.de / organization / amt / projects / pacx - mpi /

Intro Mpi

  • 1.
    GRID Computing CARTIF06 Junio 2007, Valladolid Introducción a MPI David Rodríguez González Consejo Superior de Investigaciones Científicas Instituto de Física de Cantabria, IFCA (Centro Mixto CSIC-Universidad de Cantabria) Santander ESPAÑA
  • 2.
    Contenido Introducción Modelosde computación: HTC y HPC Computación paralela Paradigma de paso de mensajes El estándar MPI Tipos de comunicación Funciones básicas y tipos de datos Algunas implementaciones Introducción a la programación en MPI Compilar y ejecutar programas MPI con MPICH Obtención de información e intercambio de mensajes MPICH-G2 Ejecución de programas en el grid Una aplicación más compleja en grid (ANN). Open MPI
  • 3.
  • 4.
    HTC y HPCHigh throughput computing (HTC). Se utilizan grandes cantidades de recursos computacionales durante largos periodos de tiempo. Lo importante es conseguir una gran cantidad de tiempo de cpu de media durante mucho tiempo, no la respuesta rápida. Se lanzan muchos trabajos independientes, y se trata de optimizar el número de trabajos ejecutados por unidad de tiempo. Colas tipo Condor, PBS, LSF… Ejemplo: simulación de sucesos en colisionadores de altas energías. High performance computing (HPC). Consiste en lograr disponer durante un periodo de tiempo corto de una gran cantidad de recursos computacionales. Lo importante es que la aplicación se ejecute en el menor tiempo posible. Aplicaciones paralelas. Ejemplo: entrenamiento distribuido de una red neuronal artificial.
  • 5.
    Computación paralela Laque se realiza usando procesos separados. Interactúan intercambiando información. Existen diversos tipos de computación paralela. Todas usan distintos datos en cada proceso: Paralelismo en los datos (“data-parallel”): Mismas operaciones en datos distintos. También llamado SIMD (Single Instruction Multiple Data) . Máquinas vectoriales. SPMD: Mismo programa, datos distintos. MIMD: Programas y datos diferentes. SPMD y MIMD son esencialmente lo mismo porque cualquier programa MIMD puede implementarse como SPMD. MPI se utiliza principalmente para SPMD/MIMD. HPF (High Performance Fortran) es un ejemplo de una interfaz de programación SIMD.
  • 6.
    ¿Por qué esnecesaria la computación paralela? Límites físicos en la mejora de las máquinas. Los sistemas de alto rendimiento especializados resultan muy caros. La computación paralela en clusters de PCs resulta más asequible. Y hace más fácil compartir los recursos (como en el grid). Muchos problemas pueden ser resueltos mucho más rápidamente gracias a la paralelización. Sin embargo, esta no es siempre una buena solución, depende mucho del tipo de problema a resolver.
  • 7.
    Speedup “ Speedup”:es la medida de la mejora que se consigue al ejecutar un programa o algoritmo en varios procesadores de forma paralela, con respecto a lo que se tarda en un sistema uniprocesador. Entonces el speedup S es el cociente entre el tiempo secuencial t s y el tiempo en n procesadores t n : S = t s /t n Pero hay que tener en cuenta que no todo el código de un programa es paralelizable. Ley Amdahl: da un límite para el speedup S = (t s + t n )/(t s + t n /n)
  • 8.
  • 9.
    Paradigma de pasode mensajes Probablemente más extendido hoy día en programación de aplicaciones paralelas. Consiste en una serie de procesos que interactúan por medio de mensajes. Cada proceso puede ejecutar código distinto y sobre diferentes datos. El modelo de paso de mensajes es valido tanto para sistemas de memoria compartida como para sistemas de memoria distribuida (cluster & grid computing). El intercambio de mensajes es cooperativo: los datos deben ser tanto enviados como recibidos explícitamente. Esto supone una ventaja en cuanto a que la modificación en la memoria del proceso es conocida por este.
  • 10.
    MPI (Message PassingInterface) Es una interfaz estándar (1993) para la programación usando el paradigma de paso de mensajes. Sirve tanto para grandes computadores de memoria compartida, como para clusters o redes de ordenadores heterogéneos (incluido el grid computing). Definida para C, C++ y FORTRAN. Comprende una gran cantidad de funciones (128), macros, etc. Pero con 6 funciones básicas se puede empezar a programar usando MPI.
  • 11.
    Implementaciones de MPIExisten bastantes implementaciones del estándar MPI. Algunas son debidas a proveedores de hardware que las proporcionan (optimizadas) paras sus máquinas (IBM, HP, SGI…), otras son desarrolladas en el ámbito académico. Algunas implementaciones son: MPICH (MPICH 2 implementa MPI2) Disponible para múltiples devices incluido globus2. LAM/MPI OpenMPI unión de varios proyectos ( FT-MPI , LA-MPI , LAM/MPI , y PACX-MPI ) . Más detalles en la charla de Sven Stork el martes.
  • 12.
    Uso de MPISe puede usar MPI para: Programas paralelos “portables”. Librerías paralelas. Programas con relaciones entre datos irregulares o dinámicas que no se ajusten a un modelo de paralelismo en los datos. Cuando no usar MPI: Si se puede usar HPF o un programa paralelo Fortran 90. Si se pueden usar librerías de más alto nivel (que pueden haber sido escritas usando MPI). Si no se necesita realmente el paralelismo 
  • 13.
  • 14.
    MPI tipos dedatos Se definen los siguientes tipos de datos MPI: MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED Corresponde a los de C, pero se añaden el tipo byte, y el empaquetado, que permite enviar simultáneamente datos de distintos tipos.
  • 15.
    MPI Funciones básicas Funciones básicas: MPI_Init => Inicialización de MPI. MPI_Finalize => Termina MPI. MPI_Comm_size => Para averiguar el número de procesos. MPI_Comm_rank => Identifica el proceso. MPI_Send => Envía un mensaje. MPI_Recv => Recibe un mensaje. Referencia del estándar en http :// www - unix.mcs.anl.gov / mpi /
  • 16.
    Ejemplo Básico: HolaMundo Escribir y Compilar el programa Hola Mundo usando MPICH. Ejecución en un cluster. Ejecución en el grid.
  • 17.
    MPICH MPICH esuna implementación gratuita de MPI 1.2 Implementa parte del nuevo estándar MPI-2 MPICH 2 implementa MPI-2 Es una implementación muy “portable”: Supercomputadores de memoria distribuida Sistemas de memoria compartida Clusters Grid Esta se puede compilar para distintos “devices” de comunicación. Consideraremos dos: MPICH-P4 Device ch-p4 dirigido a redes de ordenadores. MPICH-G2 Es una implementación “grid” de MPICH mediante el device globus2 Completamente rediseñada desde la anterior versión MPICH-G http ://www3. niu.edu / mpi /
  • 18.
    Escribiendo programas MPIDe las seis funciones básicas que mencionamos antes MPI_Init y MPI_Finalize son imprescindibles para que haya un programa MPI. Veamos un ejemplo trivial #include &quot;mpi.h&quot; #include <stdio.h> int main( int argc, char **argv ) { MPI_Init( &argc, &argv ); printf( &quot;Hola Mundo\n&quot; ); MPI_Finalize(); return 0; }
  • 19.
    Programas MPI(compilación) El programa anterior solo inicializa y termina el entorno MPI. Entre tanto cada proceso imprime un mensaje por pantalla. Para un programa pequeño como este podemos hacer una llamada directamente al comando de compilación: mpicc (para programas C) mpif77 (Fortran 77). mpif90 (Fortran 90) mpiCC (C++) Para aplicaciones más complicadas conviene usar un Makefile. En nuestro caso anterior (fichero hello.c): mpicc –o hello hello.c
  • 20.
    Ejecución de unprograma MPI con MPICH El comando mpirun se usa para ejecutar los programas MPI en MPICH. (esto no es parte del estándar) mpirun admite diversas opciones. Destacaremos las siguientes: -np N: N indica el número de procesos que se quiere en la ejecución del programa. -p4pg pgfile: indica explícitamente las máquinas en las que se quiere correr y el path del programa y usuario que se usará en cada una de ellas. -machinesfile mfile: fichero de máquinas para correr en lugar del estándar (se usa en combinación con –np). Digamos que queremos correr nuestro programa en dos máquinas de la lista estándar: mpirun -np 2 hello
  • 21.
    Ejemplo pgfile ymachinefile grid079 0 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid079 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid006 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid007 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid008 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid073.ifca.unican.es:2 grid074.ifca.unican.es:2 grid075.ifca.unican.es:2 grid076.ifca.unican.es:2 grid077.ifca.unican.es:2 grid078.ifca.unican.es:2
  • 22.
    Grupos y ComunicadoresUn grupo es un conjunto ordenado de procesos. Cada proceso de un grupo lleva asociado un identificador entero que se suele denominar “rank”. Un comunicador representa una colección de procesos que se pueden comunicar entre sí. Es un objeto con cierto número de atributos, asociado a algunas funciones para crearlos, usarlos y destruirlos. Especifica un dominio de comunicación que puede ser usado tanto en las comunicaciones punto-a-punto como en las colectivas (por los procesos que son parte de él). Evitan que exista comunicación no deseada entre determinados procesos. Contiene un grupo y un contexto
  • 23.
    Delimitación del alcancede la comunicación Grupos separados de subprocesos trabajando en diferentes subprogramas. Invocación paralela de librerías paralelas: Los mensajes propios de la aplicación deben mantenerse separados de los de la librería. MPI proporciona grupos de procesos Inicialmente el grupo “all”. Se proporcionan rutinas para la administración de los grupos. Todas las comunicaciones, no solo las colectivas, tienen lugar en grupos. Un grupo (group) y un contexto (context) se combinan en un comunicador (communicator). Fuente y destino en una operación send o receive se refieren al rank en el grupo asociado con un comunicador dado. Se puede usar MPI_ANY_SOURCE en una operación receive.
  • 24.
    MPI tipos decomunicación La comunicación MPI entre procesos puede ser de dos tipos: Punto a punto : el proceso “origen” conoce el identificador del proceso “destino” y envía un mensaje dirigido solo a él. Se usan las funciones MPI_Send y MPI_Recv. Colectiva : Operaciones en las que participan todos los procesos de un operador. Ejemplo: “ Broadcast”: El proceso origen manda el mensaje a todos los demas (que pertenezcan al mismo comunicador). Esto es típico de un esquema “master-slave”. Se usa la función MPI_Bcast. Las funciones MPI de recepción de datos son por lo general “bloqueantes”, es decir, un proceso que debe recibir un mensaje espera hasta que de hecho lo ha recibido completo.
  • 25.
    Obteniendo información deMPI Usaremos ahora dos más de las seis funciones básicas: MPI_Comm_size y MPI_Comm_rank. Así averiguaremos desde el programa el número de procesos que participan y la identificación de cada uno. int main( argc, 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&quot;, rank, size ); MPI_Finalize(); return 0; }
  • 26.
    Funciones de comunicaciónMPI A continuación veremos un poco más en detalle las funciones básicas de envío y recepción de mensajes punto a punto y broadcast. MPI_Send MPI_Recv MPI_Bcast MPI_Reduce Imagen del Tutorial de Gropp
  • 27.
    Sintaxis de MPI_Sendy MPI_Recv La operación básica de envío (bloqueante) es: La operación básica de recepción correspondiente: MPI_Recv(start, count, datatype, source, tag, comm, status) MPI_Send( start, count, datatype, dest, tag, comm ) start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato dest: Identificación del proceso destino tag: etiqueta de la comunicación comm: Identificación del comunicador start: puntero para la recepción de los datos count: número de elementos datatype: tipo de dato source: Identificación del proceso origen tag: etiqueta de la comunicación comm: Identificación del comunicador status: puntero para acceso a información sobre mensaje
  • 28.
    Ejemplo MPI_Send/MPI_Recv charmsg[100]; if(my_rank==0) { sprintf( msg ,&quot;\n\n\t Esto es un mensaje del proceso %d al proceso %d&quot;,source,dest); MPI_Send(msg,100,MPI_CHAR,dest,TAG,MPI_COMM_WORLD); printf(&quot;\n Mensaje enviado a %d&quot;,dest); } else if(my_rank==1) { MPI_Recv(msg,100,MPI_CHAR,source,TAG,MPI_COMM_WORLD,&status); printf(&quot;\n Mensaje recibido en %d&quot;,dest); printf(msg); }
  • 29.
    Adquiriendo información sobreun mensaje MPI_TAG y MPI_SOURCE son usados principalmente cuando hay MPI_ANY_TAG y/o MPI_ANY_SOURCE en la llamada MPI_Recv. MPI_Get_count se usa para determinar la cantidad de datos de un tipo dado que se han recibido. MPI_Status status; MPI_Recv( ..., &status ); ... status.MPI_TAG; ... status.MPI_SOURCE; MPI_Get_count( &status, datatype, &count );
  • 30.
    Operaciones colectivas Comunicacióncolectiva: envío de un mensaje de uno a muchos. Se hace con MPI_Bcast (Broadcast) Típicamente un master envía los mismos datos a sus esclavos. Por ejemplo, en la paralelización del entrenamiento de una red neuronal enviamos a todos los esclavos los nuevos pesos al final de cada época de entrenamiento. Operaciones colectivas: se realiza una operación matemática distribuida y se devuelve el resultado al root de la operación También es típico en un esquema master-slave. En la neura se utiliza por ejemplo en la suma de los errores de todos los esclavos. Operaciones definidas: Aritméticas: suma, multiplicación… Lógicas: AND, OR…
  • 31.
    Operaciones colectivas Imagendel Tutorial de Gropp
  • 32.
    Reduce MPI_MAX maximum integer, float integer, real, complex MPI_MIN minimum integer, float integer, real, complex MPI_SUM sum integer, float integer, real, complex MPI_PROD product integer, float integer, real, complex MPI_LAND logical AND integer logical MPI_BAND bit-wise AND integer, MPI_BYTE integer, MPI_BYTE MPI_LOR logical OR integer logical MPI_BOR bit-wise OR integer, MPI_BYTE integer, MPI_BYTE MPI_LXOR logical XOR integer logical MPI_BXOR bit-wise XOR integer, MPI_BYTE integer, MPI_BYTE MPI_MAXLOC max value and location float, double and long double real, complex,double precision MPI_MINLOC min value and location float, double and long double real, complex, double precision
  • 33.
    Sintaxis de Broadcasty Reduce Broadcast: Reduce: MPI_Bcast(start, count, datatype, root, comm) MPI_Reduce(start, result, count, datatype, operation, root, comm) start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato root: identificación del proceso origen comm: Identificación del comunicador start: puntero a los datos a enviar result: puntero para almacenar el resultado count: número de elementos a enviar datatype: tipo de dato operation: identificación de la operación colectiva root: identificación del proceso origen comm: Identificación del comunicador
  • 34.
    Reduce Operaciones predefinidaspara MPI_Reduce: MPI_MAX máximo MPI_MIN mínimo MPI_SUM suma MPI_PROD producto MPI_LAND “and” lógico MPI_LOR “or” lógico MPI_LXOR “xor” lógico MPI_BAND “bitwise and” MPI_BOR “bitwise or” MPI_BXOR “bitwise xor” MPI_MAXLOC máximo e índice del máximo MPI_MINLOC mínimo e índice del mínimo Además existe un mecanismo para que el usuario cree sus propias funciones para el “Reduce”.
  • 35.
    Ejemplo BroadCast Char msg[100]; if(my_rank==source) { sprintf(msg,&quot;\n Esto es un mensaje del proceso %d a todos los demás&quot;,sourc e); MPI_Bcast(msg,100,MPI_CHAR,source,MPI_COMM_WORLD); printf(&quot;\n Mensaje enviado a todos desde %d&quot;,source); } else { MPI_Bcast(msg,100,MPI_CHAR,source,MPI_COMM_WORLD); printf(&quot;\n Mensaje recibido en %d desde %d&quot;,my_rank,source); printf(msg); }
  • 36.
    Ejemplo Reduce intvalue; int result; value = my_rank; MPI_Reduce(&value,&result,1,MPI_INT,MPI_SUM,source,MPI_COMM_WORLD); if(my_rank==source) { printf(&quot;\n Resultado de la suma colectiva %d&quot;, result); }
  • 37.
    Topologías Una topologíaes una estructura virtual de procesos MPI. Sirve para contestar a la pregunta ¿Quiénes son mis vecinos? Asocia un esquema de direccionamiento a los procesos de un comunicador. Una topología típica es la cartesiana que consiste en un malla en la que los procesos se identifican mediante dos subíndices. Otro tipo es la topología en grafo que es más genérica. Imagen del Tutorial de Gropp
  • 38.
    Otras características. ExtensionesMPI-2 Parallel I/O. Varios procesos de un programa paralelo acceden a datos (lectura o escritura) de un fichero común. Alto rendimiento. DPM (Dynamic Process Management): Permite a un job MPI crear nuevos procesos en tiempo de ejecución y comunicarse con ellos. One sided operations. Remote Memory Access. Puede proporcionar mayor rendimiento sobre todo en redes que soportan nativamente este tipo de comunicaciones (InfiniBand y Myrinet).
  • 39.
  • 40.
    MPICH-G2 MPI sobreglobus2 MPICH-G2 es una implementación “grid enabled” del estándar MPI 1.2 Por medio del llamado globus2 device usa los servicios del Globus Toolkit 2 para ejecutar de forma distribuida (en máquinas heterogéneas) aplicaciones paralelas programadas usando MPI. La librería de comunicaciones Nexus de globus define una interfaz de comunicación de bajo nivel que utilizada para dar soporte a un amplio rango de lenguajes y librerías de nivel superior.
  • 41.
    Usando MPICH-G2 Requisitos:Certificado de usuario. En cada máquina en que se quiera correr usando mpirun Hay que tener cuenta Debe estar instalado globus y MPICH-G2 Globus gatekeeper Compilación con mpicc, mpif77, etc. Ejecutar la aplicación usando mpirun: Bajo el globus2 device esto genera un RSL Se envía a las máquinas del grid
  • 42.
  • 43.
    MPICH-P4 en gridUI RB CE WN WN WN WN WN WN WN
  • 44.
    MPICH-G2 en gridUI RB CE WN WN WN WN WN WN WN CE WN WN WN WN WN WN WN CE WN WN WN WN WN WN WN
  • 45.
    JDL Executable = &quot;hello&quot;; JobType = &quot;mpich&quot;; NodeNumber = 8; VirtualOrganisation = &quot;cg&quot;; StdOutput = &quot;std.out&quot;; StdError = &quot;std.err&quot;; InputSandbox = {&quot;hello&quot;}; OutputSandbox = {&quot;std.out&quot;,&quot;std.err&quot;}; Executable = &quot;hello.g2&quot;; JobType = &quot;mpich-g2&quot;; NodeNumber = 2; VirtualOrganisation = &quot;cg&quot;; StdOutput = &quot;std.out&quot;; StdError = &quot;std.err&quot;; InputSandbox = {&quot;hello.g2&quot;}; OutputSandbox = {&quot;std.out&quot;,&quot;std.err&quot;}; Rank = other.GlueCEStateFreeCPUs; Para MPICH P4 Para MPICH G2
  • 46.
  • 47.
    Origen Open MPIes un proyecto que combina los esfuerzos de diversos proyectos anteriores ( FT-MPI , LA-MPI , LAM/MPI , y PACX-MPI ) para crear la mejor librería MPI. En 2003 se tomó la decisión de colaborar En 2004 empezó la fase de diseño e implementación La primera versión se hizo público en 2005 Es una implementación de MPI-2 totalmente nueva. Se desarrolla como código abierto por un consorcio de socios de diversos ámbitos (investigación, educación e industria) Página web del proyecto: http :// www.open - mpi.org /
  • 48.
    Objetivos Arquitectura modularFragmentación y recreación de mensajes Diseñado para entornos heterogéneos: Varias redes Varias arquitecturas de los nodos Detección automática de errores y retransmisión Portable y con un buen rendimiento Clusters Mainframes Grid Tres capas OMPI : Open MPI ORTE : Open Runtime Environment OPAL : Open Hardware Abstraction layer
  • 49.
    Instalación Open MPIusa autotools: ./configure make make install Opciones: Compilación como librería compartida o estática Permitir o no el soporte de “threads” … Los ficheros binarios y librerías deben ser localizables por el sistema $(PREFIX)/bin -> $PATH $(PREFIX)/lib -> $LD_LIBRARY_PATH
  • 50.
    Startup Open MPIsoporta mpirun and mpiexec ORTE soporta varios mecanismos de arranque de forma nativa rsh/ssh PBS/Torque SLURM Xgrid El mecanismo de arranque puede ser seleccionado
  • 51.
    Requisitos Los demoniosde orte necesitan un puerto TCP/IP de entrada abierto ssh necesita poder conectarse sin password (public keys) Open MPI debe estar instalado tanto en el Head Node como en los Computing Nodes
  • 52.
  • 53.
    Introducción Middleware paraejecutar aplicaciones MPI en una red de computadores paralelos Desarrolla originalmente en 1995 (Vector + MPP) Implementación optimizada de MPI que cumple con el estándar. Las aplicaciones solo necesitan ser recompiladas. PACX-MPI usa las implementaciones locales optimizadas para las comunicaciones el cluster
  • 54.
    Diseño PACX-MPI arrancaun trabajo MPI en cada cluster Se encarga de controlar estos trabajos creando transparentemente un trabajo MPI mayor. PACX-MPI transforma el rank de este job mayor a los rank de los procesos MPI de los clusters Arranca dos procesos MPI adicionales ocultos para las comunicaciones con el exterior: El rank 0 local es el demonio de comunicación hacia fuera ( out_daemon ) El rank 1 local es el demonio de comunicación hacia dentro ( in_daemon )
  • 55.
    Bibliografía MPI Pacheco,P.S. Parallel Programming with MPI . Morgan Kaufmann Publishers, 1997. Snir, M. et al. MPI - The Complete Reference . Volume 1, The MPI Core. The MIT Press, 1998. Gropp, W., Lusk, E. y Skjellum, A. Using MPI, Portable Parallel Programming with the Message-Passing Interface . The MIT Press, 1994.
  • 56.
    Más sobre MPITutorial en HLRS: On-line: http :// www.hlrs.de / organization /par/ par_prog_ws / Otros recursos en el Web: MPI Forum: http://www.mpi-forum.org/ MPI en Argonne: http://www-unix.mcs.anl.gov/mpi/ MPICH 1: http://www-unix.mcs.anl.gov/mpi/mpich1/ MPICH 2 http://www-unix.mcs.anl.gov/mpi/mpich2/ OpenMPI: http://www.open-mpi.org/ LAM/MPI: http://www.lam-mpi.org/ PACX MPI: http:// www.hlrs.de / organization / amt / projects / pacx - mpi /