Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
es:centro:servizos:hpc:escribir_script [2016/02/11 17:56] – [Escribir el script] fernando.guillen | es:centro:servizos:hpc:escribir_script [2017/10/09 10:27] (actual) – [Variables de entorno durante la ejecución] diego.cougil |
---|
====== Preparación del trabajo para su envío al gestor de colas ====== | ====== Preparación del trabajo para su envío al gestor de colas ====== |
===== Compilación ===== | ===== Compilación ===== |
| ----------------- |
| === Compilación C/C++/Fortran === |
| |
== 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).((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.)) |
| |
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.7.2 de GCC (versión por defecto del SO).((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.)) | |
| |
<code bash> | <code bash> |
| |
| |
== Compilación OpenMP == | === Compilación OpenMP === |
| |
La colección de compiladores GCC permite la compilación de código OpenMP, indicándolo mediante la opción ''-fopenmp''. | La colección de compiladores GCC permite la compilación de código OpenMP, indicándolo mediante la opción ''-fopenmp''. |
</code> | </code> |
| |
== Compilación MPI == | === 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. | 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. |
| |
===== Gestión del entorno ===== | ===== Gestión del entorno ===== |
| ------------------ |
==== Gestión de software con modules ==== | ==== 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. | 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 gestion, a nivel de usuario, de los módulos se realiza con el comando ''modules'' : | La gestión, a nivel de usuario, de los módulos se realiza con el comando ''modules'' : |
| |
<code bash> | <code bash> |
* ''load'' Activa el módulo ''module_name'' | * ''load'' Activa el módulo ''module_name'' |
* ''unload'' Desactiva el módulo ''module_name'' | * ''unload'' Desactiva el módulo ''module_name'' |
* ''purge'' Desactiva todos los los módulos de la sesión actual. | * ''purge'' Desactiva todos los módulos de la sesión actual. |
| |
| |
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 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 difentes módulos**. En cualquier caso, el comando ''module avail'' porporciona una lista completa de todos los los módulos y versiones disponibles. | 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. |
| |
===== Escribir el script ===== | ==== 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''): |
| * ''PBS_O_WORKDIR'': contiene el //path// del directorio de trabajo (''$PWD'') desde donde se ha ejecutado el comando ''qsub''. Es útil para establecer un directorio de referencia durante la ejecución de los trabajos indicados. |
| * ''PBS_ARRAYID'': contiene el índice del array correspondiente cuando el trabajo se lanza con la opción -t. |
| * ''PBS_JOBID'': el job_id asignado al trabajo. |
| * ''PBS_JOBNAME'': el nombre asignado por el usuario al trabajo. |
| |
| 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**. | 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**. |
| |
| |
==== Parámetros PBS ==== | ==== Parámetros PBS ==== |
| === Básicos === |
* ''-N'' Indica el nombre de referencia de nuestro trabajo en el sistema de colas. Por defecto sería el nombre del ejecutable.\\ Ej: ''#PBS -N myjob'' | * ''-N'' Indica el nombre de referencia de nuestro trabajo en el sistema de colas. Por defecto sería el nombre del ejecutable.\\ Ej: ''#PBS -N myjob'' |
* ''-l'' Indica los recursos que se solicitan para la ejecución de nuestro trabajo, como el número de núcleos computacionales y el tiempo de ejecución. Los diferentes tipos de recursos se separan por comas.\\ Ej: ''#PBS -l nodes=1:ppn=1,walltime=1:00:00'' | * ''-l'' Indica los recursos que se solicitan para la ejecución de nuestro trabajo, como el número de núcleos computacionales y el tiempo de ejecución. Los diferentes tipos de recursos se separan por comas.\\ Ej: ''#PBS -l nodes=1:ppn=1,walltime=1:00:00'' |
* ''-m'' Indica el tipo de eventos que serán notificados por correo electrónico. Los argumentos posibles de esta opción son: ''b'' cuando el trabajo se emita a los nodos, ''a'' en caso de que se aborte la ejecución del trabajo inexperadamente y/o ''e'' cuando el trabajo termine su ejecución sin ningún incidente. Estos argumentos no son excluyentes y se pueden combinar.\\ Ej: ''#PBS -m ae'' | * ''-m'' Indica el tipo de eventos que serán notificados por correo electrónico. Los argumentos posibles de esta opción son: ''b'' cuando el trabajo se emita a los nodos, ''a'' en caso de que se aborte la ejecución del trabajo inexperadamente y/o ''e'' cuando el trabajo termine su ejecución sin ningún incidente. Estos argumentos no son excluyentes y se pueden combinar.\\ Ej: ''#PBS -m ae'' |
* ''-M'' Indica la dirección de correo en la que se notificarán los eventos indicados con la opción ''-m''.\\ Ej: ''#PBS -M nombre.usuario@usc.es'' | * ''-M'' Indica la dirección de correo en la que se notificarán los eventos indicados con la opción ''-m''.\\ Ej: ''#PBS -M nombre.usuario@usc.es'' |
| |
| === Avanzados === |
* ''-t'' Crea un array de trabajos. Útil cuando se quieren enviar muchos trabajos que usan el mismo script y solo cambian los datos de entrada. Se definen uno o varios rangos de números separados por comas y/o guiones. Si solo se pone un único número, el rango será de 0 hasta dicho número. \\ Ej: | * ''-t'' Crea un array de trabajos. Útil cuando se quieren enviar muchos trabajos que usan el mismo script y solo cambian los datos de entrada. Se definen uno o varios rangos de números separados por comas y/o guiones. Si solo se pone un único número, el rango será de 0 hasta dicho número. \\ Ej: |
<code bash> | <code bash> |
... | ... |
</code> | </code> |
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. | 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. |
| * ''-W'' Permite especificar atributos adicionales para el trabajo con el formato ''nombre=valor[,nombre=valor...]''. La lista completa y su formato está en la página del MAN. El atributo más útil es ''depend=dependency_list'' que permite establecer dependencias entre trabajos. |
| 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): |
| <code bash> |
| #PBS -Wdepend=afterok:<job1_id> |
| </code> |
| |
| ===== Scritps de ejemplo ===== |
| |
| Hay numerosos ejemplos de scripts para diversos lenguajes de programación en [[ es:centro:servizos:hpc:escribir_script:ejemplos | esta página ]]. |
| |
Por defecto, el entorno de ejecución del sistema Torque/PBS define algunas variables de entorno que pueden ser utilizadas dentro de los scripts: | |
* ''PBS_O_WORKDIR'': contiene el //path// del directorio de trabajo (''$PWD'') desde donde se ha ejecutado el comando ''qsub''. Es útil para establer un directorio de referencia durante la ejecución de los trabajos indicados. | |
* ''PBS_ARRAYID'': contiene el índice del array correspondiente cuando el trabajo se lanza con la opción -t. | |