Estás aquí: start » centro » servizos » hpc » escribir_script

Preparación do traballo para o seu envío ao xestor de colas

Esta é unha revisión antiga do documento!


>> Volver á páxina principal do clúster

Preparación do traballo para o seu envío ao xestor de colas

Compilación


Compilación C/C++/Fortran

A colección de compiladores GNU (GNU Compiler Collection, GCC) é accesible no clúster a través dos seus comandos e opcións habituais. Por defecto, os compiladores instalados no sistema pertencen á versión 4.9.2 de GCC (versión por defecto do 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

As opcións recomendadas son:

  • -O Xera código optimizado para obter un maior rendemento. É equivalente a -O1. Alternativamente, pódense utilizar as opcións -O0, -O2 ou -O3. O número indica o nivel de optimización, sendo 0 o nivel sen ningún tipo de optimización e 3 o nivel co que se obtén un maior rendemento (a opción -O3 realiza algunhas optimizacións agresivas que poden xerar resultados imprecisos).
  • -o <name> Establece o nome do ficheiro executable.

Compilación OpenMP

A colección de compiladores GCC permite a compilación de código OpenMP, indicándoo mediante a 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 é preciso cargar un módulo MPI (como, por exemplo, o módulo openmpi), que proporcione os scripts de compilación de código MPI (mpicc, mpicxx, mpif77). Estes scripts fan chamadas ao compilador da linguaxe correspondente.

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

Xestión do contorno


Xestión de software con modules

O comando modules permite xestionar, de maneira eficaz e consistente, múltiples versións de librarías e sofware para que o usuario empregue a versión axeitada en función dos seus requirimentos. O seu funcionamento baséase no encapsulamento, dentro dun módulo, das variables de contorna relacionadas cunha versión de software determinada. Deste xeito, é o propio usuario quen xestiona a utilización das diferentes versións de software dispoñibles no sistema.

A xestión, a nivel de usuario, dos módulos realízase co comando modules :

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

As opcións son:

  • avail Amosa todos os módulos dispoñibles no sistema.
  • list Amosa todos os módulos que están a ser empregados na sesión actual.
  • loade Activa o módulo module_name
  • unload Desactiva o módulo module_name
  • purge Desactiva todos os módulos da sesión actual.

O comando modules manipula as variables de contorna relacionadas cos path do sistema (PATH, LD_LIBRARY_PATH, etc.), polo que se recomenda aos usuarios non modificar estas variables de xeito arbitrario.

Recoméndase utilizar este comando de maneira interactiva. O seu uso dentro de .bashrc para cargar automaticamente módulos habituais non está recomendado, xa que todos os scripts que se executen len este ficheiro.

Recoméndase empregar as versións por defecto dos diferentes módulos. En calquera caso, o comando module avail proporciona unha listaxe completa de todos os módulos e versións dispoñibles.

Variables de contorna durante a execución

Por defecto, a contorna de execución do sistema Torque/PBS define algunhas variables de contorna que poden ser utilizadas dentro dos scripts (listaxe completa no MAN de qsub):

  • PBS_O_WORKDIR: contén o path do directorio de traballo ($PWD) dende onde se executou o comando qsub. É útil para establecer un directorio de referencia durante a execución dos traballos indicados.
  • PBS_ARRAYID: contén o índice do array correspondente cando o traballo se lanza coa opción -t.
  • PBS_JOBID: o job_id asignado ao traballo.
  • PBS_JOBNAME: o nome asignado polo usuario ao traballo.

Ademais calquera variable exportada desde o script de lanzamento do traballo estará dispoñible na contorna de execución.

Escribir o script


O envío de traballos realízase a través dun comando cuxo argumento obrigatorio é o nome dun script de shell. O script ten que dispor de permisos de execución.

ct$ chmod u+x script.sh

Dentro do script, o usuario debe indicar as accións que se realizarán nos nodos, unha vez que os recursos requiridos estean dispoñibles. Exemplos de scripts contén diferentes exemplos relacionados cos módulos instalados no clúster).

O script ten basicamente tres elementos:

  1. A definición do intérprete a usar, por defecto #!/bin/bash
  2. Unha serie de comentarios de BASH que comezan por #PBS de modo que actúan como instrucións para o xestor de colas.
  3. Comandos de BASH que definen o traballo a executar.

Exemplo 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

  • -N Indica o nome de referencia do noso traballo no sistema de colas. Por defecto sería o nome do executable.
    Ex: #PBS -N myjob
  • -l Indica os recursos que se solicitan para a execución do noso traballo, como o número de núcleos computacionais e o tempo de execución. Os diferentes tipos de recursos sepáranse por comas.
    Ex: #PBS -l nodes=1:ppn=1,walltime=1:00:00
    • nodes=N:ppn=K: solicitamos N nodos computacionais, e K núcleos en cada nodo.2)
    • walltime=HH:MM:SS: solicitamos a exclusividade dos recursos durante un tempo máximo de HH horas, MM minutos e SS segundos. O límite máximo de tempo permitido é de 168 horas (1 semana).

* -e Indica o ficheiro no que se redireccionará a saída estándar de erro do noso executable. Por defecto, a saída estándar de erro redirecciónase a un ficheiro con extensión .eXXX (onde XXX representa o identificador PBS do traballo).
*Ex: #PBS -e mySTD.err

  • -ou Indica o ficheiro no que se redireccionará a saída estándar do noso executable. Por defecto, a saída estándar redirecciónase a un ficheiro con extensión .oXXX (onde XXX representa o identificador PBS do traballo).
    Ex: #PBS -ou mySTD.out
  • -m Indica o tipo de eventos que serán notificados por correo electrónico. Os argumentos posibles desta opción son: b cando o traballo se emita aos nodos, a no caso de que se aborte a execución do traballo inesperadamente e/ou e cando o traballo termine a súa execución sen ningún incidente. Estes argumentos non son excluíntes e pódense combinar.
    Ex: #PBS -m ae
  • -M Indica a dirección de correo na que se notificarán os eventos indicados coa opción -m.
    Ex: #PBS -M nombre.usuario@usc.es

Avanzados

  • -t Crea un array de traballos. Útil cando se queren enviar moitos traballos que usan o mesmo script e só cambian os datos de entrada. Defínense un ou varios rangos de números separados por comas e/ou guións. Se só se pon un único número, o rango será de 0 ata o devandito número.
    Ex:
...
#PBS -t 0-4
cat input.${PBS_ARRAYID} > output.${PBS_ARRAYID}
...

Neste exemplo os datos de entrada atópanse en 5 ficheiros chamados input.0, input.1,etc. Ao usar este script, xeraremos 5 traballos distintos cada un cun valor do índice distinto. O de índice 0 lerá os datos de entrada do arquivo input.0 e escribirá a saída en output.0, o de índice 1 usará input.1 e output.1, etc.

  • -W Permite especificar atributos adicionais para o traballo co formato nomee=valor[,nomee=valor…]. A listaxe completa e o seu formato está na páxina do MAN. O atributo máis útil é depend=dependency_list que permite establecer dependencias entre traballos.

Por exemplo, para facer que o traballo 2 comece cando job1 rematase con éxito poriamos isto no script que lanza o job2 (fai falla saber o job_id do traballo 1):

#PBS -Wdepend=afterok:<job1_id> 

Scritps de exemplo

Hai numerosos exemplos de scripts para diversas linguaxes de programación nesta página .

1)
Esta versión dos compiladores dispón dunha opción de optimización (march) para xerar código específico para a arquitectura dos nodos do clúster (procesadores Opteron 6200 series, 15th Family Bulldozer Interlagos). Esta opción de compilación non garante o cumprimento do estándar matemático definido en GCC, polo que non se recomenda o seu uso, salvo naqueles casos nos que se coñeza en profundidade o comportamento das opcións de compilación.
2)
Non se garante a execución en exclusividade dos nodos, se non se solicitan os 64 núcleos dun nodo.