[[ es:centro:servizos:hpc#instrucciones_de_uso_del_cluster| >> 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).((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.))
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 '' 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.
* ''load'' 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. [[:centro:servizos:hpc:escribir_script:ejemplos|Exemplos de scripts]] contén diferentes exemplos relacionados cos módulos instalados no clúster).
O script ten basicamente tres elementos:
- A definición do intérprete a usar, por defecto ''#!/bin/bash''
- Unha serie de comentarios de BASH que comezan por ''#PBS'' de modo que actúan como instrucións para o xestor de colas.
- 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.((Non se garante a execución en exclusividade dos nodos, se non se solicitan os 64 núcleos dun nodo.))
* ''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:
===== Scritps de exemplo =====
Hai numerosos exemplos de scripts para diversas linguaxes de programación [[ es:centro:servizos:hpc:escribir_script:ejemplos | nesta páxina ]].