[[ 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 ]].