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.
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.
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.
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
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.
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.
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
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”.
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)
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.
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
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
Página anterior | Volver al principio del trabajo | Página siguiente |