1 / 270

PROGRAMACIÓN CON MPI Y OPENMP EN EL CLUSTER EULER

PROGRAMACIÓN CON MPI Y OPENMP EN EL CLUSTER EULER. ____________________________________________ Angelines Alberto Morillas Telf. +34 91 346 6025 Divisón de Supercomputación y Desarrollo Grid CIEMAT Avenida Complutense, 22 28040 Madrid ____________________________________________.

dunn
Download Presentation

PROGRAMACIÓN CON MPI Y OPENMP EN EL CLUSTER EULER

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PROGRAMACIÓN CON MPI Y OPENMPEN EL CLUSTER EULER ____________________________________________ Angelines Alberto Morillas Telf. +34 91 346 6025 Divisón de Supercomputación y Desarrollo Grid CIEMAT Avenida Complutense, 22 28040 Madrid ____________________________________________

  2. ÍNDICE • PROGRAMACIÓN EN ENTORNO CLUSTER EULER • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • PROGRAMACIÓN CON PARALELISMO IMPLÍCITO (OpenMP)

  3. ÍNDICE • PROGRAMACIÓN EN ENTORNO CLUSTER EULER • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • PROGRAMACIÓN CON PARALELISMO IMPLÍCITO (OpenMP)

  4. ÍNDICE • PROGRAMACIÓN EN ENTORNO CLUSTER EULER • Características • Conexión a EULER • Software en EULER • Compiladores • Optimización • Depuración de Errores • Programación paralela • Ejecución paralela

  5. CLUSTER EULERCaracterísticas. • En su configuración actual dispone de 146 nodos Intel(R) Xeon(R) CPU E5450@ 3.0GHz. • Cada nodo tiene 8 procesadores o “cores”, lo que hace un total de 1152. • Cada nodo tiene 16 GB de memoria, ó 2 GB por core. • Además dispone de dos nodos para acceso interactivo y dos nodos de gestión • Todos los nodos se han interconectado a una red de alta velocidad Infiniband que se utilizará para la comunicación entre los procesos que colaboran en los trabajos paralelos MPI.

  6. CLUSTER EULERCaracterísticas. • El cluster está basado en el sistema operativo linux (Red Hat Enterprise). • Dispone las herramientas habituales de software libre. • Existen dos nodos que actúan como frontend para que los usuarios puedan conectarse en forma interactiva. • El resto de los nodos actúan como servidores de cálculo accesibles sólo a través del entorno batch.

  7. CLUSTER EULERConexión a EULER. • Para conectarse desde un desktop basado en MS Windows/CENIT se dispone de un cliente ssh llamado PUTTY (Z:\P32\PUTTY\PUTTY.EXE) • También se puede utilizar el emulador de ventanas X llamado Exceed. (http://intranet.ciemat.es/ICIEMATportal/portal.do?TR=A&IDR=1&identificador=1679) • En desktop basado en Linux basta utilizar el cliente habitual ssh. Ejemplos: ssh euler ssh -f -X euler gnome-terminal

  8. CLUSTER EULERSoftware en EULER. • Sistema Operativo • Red Hat Enterprise Linux AS release 4 (64 bits). Dispone de herramientas gráficas de administración, planificador de procesamiento paralelo, distribución dinámica de procesos, etc. • Compiladores • Se han instalado los dos grupos de compiladores más usuales en estas plataformas: • GNU: Compiladores de Fortran 90, C y C++ . Se han instalado dos versiones de los compiladores: • la versión 3.4 (comandos gcc, g++ y g77) • la versión 4.1 (comandos gcc4, g++4 y gfortran). • Intel: Compiladores de Fortran, C y C++ versión 10.1.

  9. CLUSTER EULERSoftware en EULER. • Herramientas para desarrollo de aplicaciones paralelas: • MPI: (Message Passing Interface), el estándar de facto para programación con paso de mensajes explícitos. • OpenMP: Es una API (Application Program Interface) basada en directivas, rutinas y variables de entorno que facilita la paralelización en arquitecturas de memoria compartida. Está integrada en los compiladores de Intel, y se accede con un simple flag. • Utilidades de software público: • La mayor parte de la colección de software de GNU. Se instalará en el futuro cualquier paquete que pueda necesitar un usuario del centro. • Sistema de gestión de bach y planificación basado en Torque/Moab.

  10. CLUSTER EULERCompiladores. • La máquina dispone de compiladores de Fortran, C y C++, tanto de Intel como de GNU, que se pueden invocar con los siguientes comandos: ifort -o prog prog.f90 (Fortran 90, compilador de Intel) g77 -o prog prog.f (Fortran 77, compilador de GNU) gfortran -o prog prog.f90 (Fortran 90, compilador de GNU) icc -o prog prog.c (C, compilador de Intel) gcc/gcc4 -o prog prog.c (C, compilador de GNU) icpc -o prog prog.cc (C++, compilador de Intel) g++/g++4 -o prog prog.cc (C++, compilador de GNU)

  11. CLUSTER EULERCompiladores. • En caso de utilizar los compiladores de Intel es necesario añadir los directorios correspondientes al “PATH” y al “LD_LIB RARY_PATH”. Esto puede hacerse con los scripts siguientes: • Si se usa bash source /opt/intel/cce/10.1.015/bin/iccvars.sh source /opt/intel/fce/10.1.015/bin/ifortvars.sh • Si se usa tcsh source /opt/intel/cce/10.1.015/bin/iccvars.csh source /opt/intel/fce/10.1.015/bin/ifortvars.csh

  12. CLUSTER EULEROptimización de Intel • Los flags (opciones) más comunmente utilizados al invocar el compilador de Fortran de Intel, en general para optimizar código y conseguir que se ejecute más rápidamente, son los siguientes • Flags para optimización: • -O0: Sin optimización. • -O1: Optimización local. • -O2,-O: Optimización extensiva. Es el defecto. • -O3: Ejecuta más SWP, prefetching, reogarnización de loop, etc. • -ip: intra-file/inter-file interprocedural optimization. • -prof_gen/-prof_use: optimización con feedback; útil si se tienen un buen conjunto de pruebas. • -fno-alias, -fno-fnalias: Mejor optimización al indicar el uso de punteros sin utilizar aliasing. • -opt_report: Genera un reporte de la optimización. • -ftz: fija underflows a cero, evitando traps del kernel (habilitado por defecto en -03).

  13. CLUSTER EULEROptimización de Intel • Una regla práctica a seguir es Intentar al menos "-O2" en todas las rutinas. Tratar de compilar las rutinas que más tiempo consuman con “ -O3". • En este último caso, sin embargo, debe tenerse en cuenta que los resultados pueden cambiar ligeramente debido a diferencias en los redondeos. Además aumentará el tiempo de compilación, por lo que no conviene utilizar estos flags cuando se está desarrollando.

  14. CLUSTER EULEROptimización de Intel • Flags de paralelización: • parallel: AutoParalelización. Convierte de forma a utomática código secuencial en paralelo por medio de directivas. • openmp: Hace que el compilador reconozca las directivas OpenMP. • Flags para facilitar el porting y debug de códigos: • -posixlib: Funciones de IEEE* POSIX FORTRAN-77 Language bindings, como específicado en IEEE Standard 1003.9-1992. • -i8: Representación interna de enteros en 64 bits (8 bytes). • -r8: Representación interna de reales y complejos en 64 bits. • -zero: Inicializa variables a 0. • -g: Genera código apto para depurar (debug). • -save: Colocación de variables en memoria estática.

  15. CLUSTER EULERDepuración de errores • Para el "debugging" de código disponemos de diferentes herramientas que nos ayudan a encontrar fallos en el código fuente: • Debugger de Intel (idb): • Soporta Fortran, C y C++. Tiene una interface basada en línea de comandos. Se invocacon el comando “idb” seguido del nombre del ejecutable. Además, idb cuenta con una interfaz gráfica, para ello, se invoca con el flag “-gui”. Ejemplos: idb a.out (modo línea) idb -gui a.out (modo gráfico en X window) • Debugger de GNU (gdb): • GNU debugger. Soporta C y C++ y Fortran. También es un depurador en modo línea, y por lo tanto se utiliza poco.

  16. CLUSTER EULERDepuración de errores • Data Display Debugger (ddd): • Es uninterfaz gráfico para gdb y otros debuggers (incluido el de intel). • Funciona bajo X Window ya que se trata de una herramienta gráfica. • Para iniciar un ciclo de depuración (debug) se debe compilar el código con el flag "-g", que inhibe parcialmente la optimización y genera información simbólica en el código ejecutable para el debugger, esencialmente los números de líneas correspondientes entre fuente y ejecutable: ifort -g -o prog.exe prog.f (Fortran) icc -g -o prog.exe prog.c (C) • A continuación se invoca al debugger: ddd prog.exe • Aparecerá una ventana X en la q ue podemos realizar las operaciones necesarias para la depuración de nuestro código. Una forma sencilla de empezar consiste en pisar el botón "Run" que inicia la ejecución y esperar a ver en qué línea se muere nuestro programa.

  17. CLUSTER EULERProgramación paralela • OpenMP • Se pueden compilar y ejecutar programas que utilicen directivas OpenMP, utilizando los compiladores de Intel. • Se dene compilar el código con el flag " -openmp". • Antes de ejecutar se debe declarar la variable de entorno "OMP_NUM_THREADS" con el número de procesadores que deseemos: ifort -openmp prog.f -o prog.exe setenv OMP_NUM_THREADS 4 (csh) export OMP_NUM_THREADS=4 (sh) prog.exe

  18. CLUSTER EULERProgramación paralela • MPI • La máquina dispone de varias implementaciones de la librería MPI que pueden utilizarse según conveniencia. • La motivación de tener varias implementaciones es ayudar a los usuarios en los problemas relacionados con la portabilidad de códigos. • Existen códigos de cálculo basados en MPI fáciles de portar a la plataforma con una determinada implementación y no con otras. El usuario debe elegir cual de ellas es mejor para su código. • Las implementaciones de la librería MPI disponibles en nuestro cluster son MPICH, MPICH2, LAM, OPENMPI y MVAPICH.

  19. CLUSTER EULERProgramación paralela • MPI • OPENMPI parece ser la implementación dominante últimamente. • Otras implementaciones como MPICH2 y LAM/MPI ofrecen la ventaja de menores tiempos de latencia. • Las tres implementaciones de la librería que soportan comunicaciones a través de la red infiniband son MVAPICH, MVAPICH2 y OPENMPI. • La mayoría de las aplicaciones paralelas pueden potencialmente obtener mejores resultados en cuanto a velocidad y escalado utilizando infiniband. • Las otras implementaciones darán menor rendimiento en la mayor parte de los casos, pero están instaladas por motivos de portabilidad de software.

  20. CLUSTER EULERProgramación paralela • MPI • Para ver la lista de implementaciones de MPI disponibles ejecutar el comando: switcher mpi --list • En el momento de escribir este manual las opciones son las siguientes: • lam-X.X.X • lam-intel-X.X.X • mpich-ch_p4-gcc-X.X.X • mpich-ch_p4-intel-X.X.X • openmpi-X.X.X • openmpi-intel-X.X.X ib-mvapich-X.X.X-gccib-mvapich-X.X.X-intelib-mvapich2-X.X.X-gccib-mvapich2-X.X.X-intelib-openmpi-X.X.X-gccib-openmpi-X.X.X-intel

  21. CLUSTER EULERProgramación paralela • MPI • Se puede averiguar el módulo cargado en en el perfil del usuario con el siguiente comando: switcher mpi • Para compilar y ejecutar programas con MPI, tendremos que tener en el “path” los comandos adecuados y en el “library path” las librerías correspondientes. • El programador puede hacerlo del modo usual en UNIX, modificando las variables de entorno “PATH” y “LD_LIBRARY_PATH”, o con la utilidad “switcher”.

  22. CLUSTER EULERProgramación paralela • MPI • Ejemplo: si se desea cambiar al entorno LAM con compilador intel: switcher mpi = lam-intel-7.1.2 switcher_reload • El primer comando cambia el fichero de configuración y el segundo lo carga para actualizar las variables de entorno. • Una vez elegida la implementación de MPI que se va a utilizar, ya se dispone en el PATH de las utilidades necesarias para compilar y ejecutar aplicaciones. • Actualmente es necesario ejecutar también el comando: mpi-selector-menu (elegir la opción adecuada)

  23. CLUSTER EULERProgramación paralela • MPI • La compilación se realiza utilizando los comandos “mpif90”, “mpìcc” y “mpicxx” que se encargan de invocar a los compiladores y añadir los flags para las librerías propias de MPI. • Ejemplos: mpif90 -o prog.exe prog.f90 (Fortran) mpicc -o prog.exe prog.c (C) mpicxx -o prog.exe prog.cc (C++) • La ejecución de una aplicación MPI depende de la implementación que se haya utilizado para compilarla. Lo usual es utilizar los comandos “mpirun” o “mpiexec”. • Ejemplos: mpirun -np 8 prog.exe mpiexec -n 8 prog.exe • En la práctica estos comandos se utilizan en el entorno batch.

  24. CLUSTER EULEREjecución paralela • La ejecución de los programas de cálculo se debe realizarse utilizando el sistema de batch. • Para ello, lo usual es crear un “script” o fichero de comandos de shell que contenga en las primeras líneas los “flags” para el sistema batch. • A continuación se ofrece un ejemplo sencillo: #PBS -l nodes=8 cd ${PBS_O_WORKDIR} NUMPROC=`wc -l ${PBS_NODEFILE} | awk ' {print $1} ' ` mpirun -np $NUMPROC -machinefile ${PBS_NODEFILE} prog.exe

  25. CLUSTER EULEREjecución paralela • La sintaxis de la última línea es válida en el caso de utilizar las implementaciones MPICH y OPENMPI. • En caso de utilizar MVAPICH2 debe cambiarse por estas dos: mpdboot -n $NUMPROC -f $PBS_NODEFILE mpiexec -n $NUMPROC prog.exe • Esto es así porque antes de ejecutar con “mpiexec” es necesario arrancar el demonio con el comando “lamboot”. • Por último, si se utiliza la implementación LAM entonces debe cambiarse por estas líneas: lamboot -d -f $PBS_NODEFILE mpiexec -n $NUMPROC prog.exe lamcleanup

  26. ÍNDICE • PROGRAMACIÓN EN ENTORNO CLUSTER • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • PROGRAMACIÓN CON PARALELISMO IMPLÍCITO (OpenMP)

  27. ÍNDICE • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • Introducción • Getting started • Comunicaciones punto a punto • Comunicaciones bloqueantes y no bloqueantes • Comunicaciones colectivas • Tipos de datos derivados • Comunicadores y grupos • Topologías vituales • Introducción a MPI-2

  28. ÍNDICE • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • Introducción • Getting started • Comunicaciones punto a punto • Comunicaciones bloqueantes y no bloqueantes • Comunicaciones colectivas • Tipos de datos derivados • Comunicadores y grupos • Topologías vituales • Introducción a MPI-2

  29. MPIIntroducción. Paralelismo • Paralelismo: • Significa realizar múltiples cosas al mismo tiempo, de tal manera que se hace más trabajo en el mismo lapso de tiempo. • Uso de múltiples unidades de procesamiento para resolver un problema. Las unidades de procesamiento son: • Procesos lógicos. • Procesadores físicos (cores). • Uso de múltiples unidades de procesamiento operando concurrentemente sobre diferentes partes de un problema. Estas partes pueden ser: • Diferentes tareas • La misma tarea sobre diferentes piezas de datos.

  30. MPIIntroducción. Tipos de paralelismo • Tipos de paralelismo • Memoria compartida (Shared). • Memoria distribuida (Distributed). • Híbrido (Shared/Distributed). • Hilos, Procesos, Multi-hilos, Multi-procesos • Hilos (Threads): secuencias de ejecución que comparten un área de memoria (address space). • procesos (Processes): secuencias de ejecución son su propia memoria independiente. • Multi-hilos (Multi-threading): paralelismo vía multiples hilos. • Multi-procesamiento (Multi-processing): paralelismo vía multiples procesos.

  31. MPIIntroducción. Reglas generales • Reglas generales • Paralelismo de memoria compartida => hilos. • Paralelismo distribuido => procesos. • Cuantas más unidades de procesamiento se tengan se puede reducir el tiempo de ejecución. • Cuantas más unidades de procesamiento se tengan se pueden resolver problemas más grandes. • En la práctica algunos términos se usan indistintamente: • Paralelismo • Concurrencia • Multihilos • Multiprocesamiento

  32. MPIIntroducción. Memoria compartida • Un computadora de memoria compartida provee de hardware que soporta acceso (lectura/escritura) a un espacio de memoria para varios procesadores (Multiprocessors). • Los procesadores interactúan modificando datos almacenados en este espacio. • El mayor problema en este tipo de arquitecturas es el ancho de banda del bus de acceso a memoria. • Además, en cada lectura/escritura, cada procesador debe pasar por múltiples etapas. • Una solución es añadir una memoria local a cada procesador. • UMA (Uniform Memory Access), NUMA, Cache-coherence.

  33. Memoria compartida. Arquitectura básica MPIIntroducción. Memoria compartida

  34. Memoria compartida. Arquitectura básica MPIIntroducción. Memoria compartida

  35. En este tipo de arquitectura cada procesador tiene su propia memoria local (Multicomputer). Beneficios: No hay bus de memoria compartida (evita problemas de ancho de banda). No hay límite para el número de procesadores, esto depende de la red de interconexión. No hay problemas de cache-coherency. Desventajas: Las tareas que se ejecutan en cada procesador solo operan sobre datos locales, por lo que si se requieren datos remotos, se debe realizar una comunicación con otros procesadores. Tiempo para construir y enviar un mensaje. Tiempo para recibir y desempaquetar el mensaje. MPIIntroducción. Memoria distribuida

  36. Memoria distribuida. Arquitectura básica MPIIntroducción. Memoria distribuida

  37. Memoria distribuida. Ring MPIIntroducción. Memoria distribuida

  38. Una taxonomía es un modelo basado en un conjunto de características que provee una información condensada que es útil cuando se comparan cosas. La taxonmía más famosa en cómputo paralelo es la de Flynn que se basa en el flujo de información (instrucciones y datos) en una computadora. Esta información solo tiene dos valores: uno(single) o varios(multiple). Instruction stream: se refiere a la progresión de instrucciones que se ejecutan en la computadora. Data stream: se refiere a la progresión de los valores de los datos que son llevados a la memoria del CPU. MPIIntroducción. Taxonomías

  39. Taxonomía de Flynn SISD (Single Instruction, Single Data) : Computadora de von Neumann. SIMD (Single Instruction, Multiple Data) : En estas computadoras se aplica una instrucción a un grupo de datos simultáneamente. MISD (Multiple Instruction, Single Data) : Ningún tipo de arquitectura cae dentro de este tipo. MIMD (Multiple Instruction, Multiple Data) : Los procesadores obedecen automáticamente sus propias secuencias de instrucciones y las aplican a sus propios datos. MPIIntroducción. Taxonomía de Flynn

  40. MPIIntroducción. Taxonomía de Flynn • Flujo de información

  41. MPIIntroducción. Taxonomía de Flynn • Memoria

  42. MPIIntroducción. Taxonomía de Flynn • Memoria y procesadores

  43. MPIIntroducción. ¿Qué es MPI? • Biblioteca estándar para programación paralela bajo el paradigma de comunicación de procesos mediante pasaje de mensajes. • Biblioteca, no lenguaje. Proporciona funciones. • Propuesta por un comité conformado de especialistas, vendedores y usuarios de HPC: • IBM, Intel, TMC, Meiko, Cray, Convex, Ncube • PVM, p4, Zipcode, TCGMSG, Chameleon, Express, Linda • Especialistas: ARCO, ANL, UC Santa Barbara, Convex, GMD, Syracuse University, Cray Research, LANL, Michigan State University, IBM, Oregon Grad Inst, Intel, NOAA, University of New Mexico, KAI, NSF, Mississippi State University, Meiko, ORNL, U of Southampton, NAG, PNL, Univeristy of Colorado, nCUBE, Sandia, Yale U, ParaSoft, SDSC, University of Tennessee, Shell, SRC, University of Maryland, TMC, Western Michigan Univeristy, University of Edinburgh, Cornell University, Rice University, University of San Francisco • Objetivo: desarrollar un estándar portable y eficiente, para programación paralela.

  44. MPIIntroducción. ¿Qué es MPI? • Fue diseñado para HPC sobre computadoras masivamente paralelas y clusters.( Memoria distribuida). • Paralelismo explícito ( definido y controlado en su totalidad por el programador) • Modelo de programa: SPMD • Único mecanismo de comunicación: MP. • Existen implementaciones libres y algunas particulares para ciertas plataformas. • MPICH, LAM, OpenMPI, winmpich. • MPI se puede usar con: C, C++, Fortran 77/90/95. • Java(?), más información : mpiJava, Java grande.

  45. MPIIntroducción. ¿Qué es MPI? • Actualmente es muy maduro, fácil de entender, eficiente y existe mucho software alrededor de MPI. • Características de MPI-1.1 (1995) • Modular, portable, heterogeneo, comunicaciones seguras, subgrupos, topologías, herramientas para medición de desempeño, comunicación punto a punto, comunicación colectiva. • Características de MPI-1.2 y MPI-2 (1997) • Extensiones, aclaraciones y correcciones de MPI-1.1. • MPI-2: manejo y creación de procesos, operaciones colectivas extendidas, interfases externas, entrada/salida, language bindings. • MPICH2 (http://www.mcs.anl.gov/research/projects/mpich2)

  46. MPIIntroducción. ¿Qué es MPI? • ¿Cuando usar MPI? • Si se requiere un programa paralelo, portable y de buen desempeño. • ¿Cuando NO usar MPI? • No se requiere paralelismo. • Cuando se puede usar HPF, OpenMP, Threads (POSIX, Java, etc.).

  47. ÍNDICE • PROGRAMACIÓN CON PASO DE MENSAJES (MPI) • Introducción • Getting started • Comunicaciones punto a punto • Comunicaciones bloqueantes y no bloqueantes • Comunicaciones colectivas • Tipos de datos derivados • Comunicadores y grupos • Topologías vituales • Introducción a MPI-2

  48. MPIGetting started • C : Los nombres de todas las funciones de MPI comienzan con el prefijo MPI_. Los tipos y funciones definidas en MPI tienen una letra mayúscula después del prefijo; las letras siguientes son minúsculas. • C++ : Todas las funciones y clases estan en el espacio de nombres MPI, de tal manera que para referirnos a una función de MPI se usa MPI::Xxxxx. • Fortran : Los nombres de todas las funciones de MPI comienzan con el prefijo MPI_ y todas las demás letras son mayúsculas.

  49. MPIGetting started • mpi.h y mpif.h proveen de las definiciones básicas de MPI (funciones y tipos). • Para iniciar MPI se usa: • int MPI_Init(int *argc, char **argv); (C) • void MPI::Init(int& argc, char**& argv); (C++) • INTEGER IERR y MPI_INIT(IERR) (Fortran) • Para finalizar MPI se usa: • int MPI_Finalize(void); (C) • void MPI::Finalize(); (C++) • INTEGER IERR y MPI_FINALIZE(IERR) (Fortran)

  50. MPIGetting started. Hello world con C #include <stdio.h> #include <mpi.h> int main(int argc, char *argv[]) { int rank, size,tam; char Name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Get_processor_name(Name,&tam); printf("Hello world from %s! I am %d of %d\n", Name, rank, size); MPI_Finalize(); return 0; }

More Related