Trabajos múltiples Trabajos de ejecución múltiple



En el mundo de la supercomputación es bastante común tener que enviar conjuntos de trabajos relacionados o, incluso, con dependencias más o menos complejas entre ellos. Para ello existen varios modelos.

Los llamdos trabajos de ejecución múltiple consisten en utilizar un único trabajo que ejecute varios programas diferentes utilizando el mismo conjunto de nodos. Para ello basta con incorporar al listado básico varias llamadas srun similares que ejecuten los distintos programas. Así, en este modelo un jobfile tendría esta forma:

#!/bin/bash 
##----------------------- Start job description ----------------------- 
#@ arch = (ppc64|power|intel) 
#@ initialdir = /home/<project_id>/<data_dir> 
#@ output = res/out-%j.log 
#@ error = res/err-%j.log 
#@ total_tasks = <number of tasks> 
#@ wall_clock_limit = <hh:mm:ss> 
##------------------------ End job description ------------------------ 
##-------------------------- Start execution -------------------------- 
## First program / First run 
srun ./<myprogram1> <arg1> 
## First program / Second run 
srun ./<myprogram1> <arg2> 
## Second program / First run 
srun ./<myprogram2> <arg1> 
## Second program / Second run 
srun ./<myprogram2> <arg2> 
# ... More executions ... 
##--------------------------- End execution ---------------------------

Esta técnica tiene como principal ventaja la supresión del tiempo de espera en cola para la segunda y subsiguientes ejecuciones. Sin embargo, tiene como inconveniente que es necesario incrementar la solicitud de recursos (solicitar el número máximo de procesadores de todos los trabajos, sumar el tiempo de ejecución de todos ellos...) lo que incrementa el tiempo de espera para la primera ejecución. Normalmente esta técnica está indicada para ejecuciones del mismo programa con distinto número de argumentos y de corta duración (menos de un día). Al empaquetarlos juntos, se reduce el tiempo medio de espera y no se reciben tantas penalizaciones por el envío convulsivo de trabajos.

En este caso, al terminar la ejecución de <myprogram1> <arg1> comienza inmediatamente la de <myprogram1> <arg2>.