Táboa de Contidos

>> Volver a la página principal del cluster

Preparación del trabajo para su envío al gestor de colas

Compilación


Compilación C/C++/Fortran

La colección de compiladores GNU (GNU Compiler Collection, GCC) es accesible en el clúster a través de sus comandos y opciones habituales. Por defecto, los compiladores instalados en el sistema pertenecen a la versión 4.9.2 de GCC (versión por defecto del SO).1)

ct$ module load gcc
ct$ gcc      -O exemplo.c   -o exemplo
ct$ g++      -O exemplo.cpp -o exemplo
ct$ gfortran -O exemplo.f   -o exemplo

Las opciones recomendadas son:

Compilación OpenMP

La colección de compiladores GCC permite la compilación de código OpenMP, indicándolo mediante la opción -fopenmp.

ct$ gcc      -O -fopenmp exemplo.c
ct$ g++      -O -fopenmp exemplo.cpp 
ct$ gfortran -O -fopenmp exemplo.f   

Compilación MPI

Para compilar código MPI es necesario cargar un módulo MPI (como, por ejemplo, el módulo openmpi), que proporcione los scripts de compilación de código MPI (mpicc, mpicxx, mpif77). Estos scripts hacen llamadas al compilador del lenguaje correspondiente.

ct$ module load openmpi
ct$ mpicc  -O exemplo.c
ct$ mpicxx -O exemplo.cpp 
ct$ mpif77 -O exemplo.f   

Gestión del entorno


Gestión de software con modules

El comando modules permite gestionar, de manera eficaz y consistente, múltiples versiones de librerías y sofware para que el usuario utilice la versión adecuada en función de sus requerimientos. Su funcionamiento se basa en el encapsulamiento, dentro de un módulo, de las variables de entorno relacionadas con una versión de software determinada. De este modo, es el propio usuario quien gestiona la utilización de las diferentes versiones de software disponibles en el sistema.

La gestión, a nivel de usuario, de los módulos se realiza con el comando modules :

ct$ module avail
ct$ module list
ct$ module load module_name
ct$ module unload module_name
ct$ module purge

Las opciones son:

El comando modules manipula las variables de entorno relacionadas con los path del sistema (PATH, LD_LIBRARY_PATH, etc.), por lo que se recomienda a los usuarios no modificar estas variables de modo arbitrario.

Se recomienda utilizar este comando de manera interactiva. Su uso dentro de .bashrc para cargar automáticamente módulos habituales no está recomendado, ya que todos los scripts que se ejecuten leen este fichero.

Se recomienda utilizar las versiones por defecto de los diferentes módulos. En cualquier caso, el comando module avail proporciona una lista completa de todos los módulos y versiones disponibles.

Variables de entorno durante la ejecución

Por defecto, el entorno de ejecución del sistema Torque/PBS define algunas variables de entorno que pueden ser utilizadas dentro de los scripts (lista completa en el MAN de qsub):

Además cualquier variable exportada desde el script de lanzamiento del trabajo estará disponible en el entorno de ejecución.

Escribir el script


El envío de trabajos se realiza a través de un comando cuyo argumento obligatorio es el nombre de un script de shell. El script tiene que disponer de permisos de ejecución.

ct$ chmod u+x script.sh

Dentro del script, el usuario debe indicar la acciones que se realizarán en los nodos, una vez que los recursos requeridos estén disponibles. Ejemplos de scripts contiene diferentes ejemplos relacionados con los módulos instalados en el clúster).

El script tiene básicamente tres elementos:

  1. La definición del intérprete a usar, por defecto #!/bin/bash
  2. Una serie de comentarios de BASH que comienzan por #PBS de modo que actúan como instrucciones para el gestor de colas.
  3. Comandos de BASH que definen el trabajo a ejecutar.

Ejemplo simple de script:

#!/bin/bash
#PBS -l nodes=1:ppn=1,walltime=1:00:00
cd /path/to/job/
./executable

Parámetros PBS

Básicos

Avanzados

...
#PBS -t 0-4
cat input.${PBS_ARRAYID} > output.${PBS_ARRAYID}
...

En este ejemplo los datos de entrada se encuentran en 5 ficheros llamados input.0, input.1,etc. Al usar este script generaremos 5 trabajos distintos cada uno con un valor del índice distinto. El de índice 0 leerá los datos de entrada del archivo input.0 y escribirá la salida en output.0, el de índice 1 usará input.1 y output.1, etc.

Por ejemplo, para hacer que el trabajo 2 empiece cuando job1 haya terminado con éxito pondríamos esto en el script que lanza el job2 (hace falta saber el job_id del trabajo 1):

#PBS -Wdepend=afterok:<job1_id> 

Scritps de ejemplo

Hay numerosos ejemplos de scripts para diversos lenguajes de programación en esta página .

1)
Esta versión de los compiladores disponen de una opción de optimización (march) para generar código específico para la arquitectura de los nodos del clúster (procesadores Opteron 6200 series, 15th Family Bulldozer Interlagos). Esta opción de compilación no garantiza el cumplimiento del estándar matemático definido en GCC, por lo que no se recomienda su uso, salvo en aquellos casos en los que se conozca en profundidad el comportamiento de las opciones de compilación.
2)
No se garantiza la ejecución en exclusividad de los nodos, si no se solicitan los 64 núcleos de un nodo.