jobs array

Les jobs array permettent de lancer plusieurs exécutions en se basant sur une exécution itérative des commandes.
L'intérêt est de pouvoir gêrer l'exécution de plusieurs séquences de commande et de mieux prendre en compte la gestion des codes via pbs.

Exemple :

  • Un script lançant 4 lignes de commande successives:
#!/bin/bash -l

#PBS -N Matlab_Multi_Test
#PBS -l select=1:ppn=20
#PBS -l walltime=0:10:00
#PBS -j oe
#PBS -M user@univ-poitiers.fr
#PBS -q default
#### array size

module load XXX/XXXX

cd $PBS_O_WORKDIR

#### start matlab computations
matlab -nodisplay -nosplash < matlab0.m > out.dat0 &
matlab -nodisplay -nosplash < matlabdemo1.m > out.dat1 &
matlab -nodisplay -nosplash < matlabdemo2.m > out.dat2 &
matlab -nodisplay -nosplash < matlabdemo3.m > out.dat3 &

  • La version mettant en oeuvre le job_array:
#!/bin/bash -l

#PBS -N Matlab_Multi_Test
#PBS -l select=1:ncpus=20
#PBS -l walltime=0:10:00
#PBS -j oe
#PBS -M user@univ-poitiers.fr
#PBS -q default
#### array size
#PBS -J 0-3

module load XXX/XXXX

cd $PBS_O_WORKDIR

#### start matlab computations
matlab -nodisplay -nosplash < matlabdemo$PBS_ARRAY_INDEX.m > out.dat$PBS_ARRAY_INDEX

Lancer des simulations identiques sous plusieurs sous-répertoires.

  • On considère 6 répertoires contenant chacun un fichier d'entrée.
[user@thor ]$ ls
array.pbs    dir_0  dir_1  dir_2  dir_3  dir_4  dir_5
  • le script utilise l'option #PBS -J 0-5 pour créer les index de 0 à 5.
    L'utilisation de la commande cd dir_$PBS_ARRAY_INDEX permet de se placer dans chaque sous-répertoires.
[user@thor ]$ cat array.pbs
#!/bin/bash
#PBS -l place=scatter:excl
#PBS -l walltime=02:00:00
#PBS -l select=1:ncpus=20:mpiprocs=20
#PBS -j oe
#PBS -q small
#PBS -N array
#PBS -m ae -M user@ensma.fr
#PBS -J 0-5

cd ${PBS_O_WORKDIR}
#Affichage dans le fichier de sortie de plusieurs informations
NCPU=`wc -l < $PBS_NODEFILE`

CODE=/path/to/your/code
INP_FILE=./input

ulimit -s unlimited

cd dir_$PBS_ARRAY_INDEX

mpiexec_mpt -np $NCPU $CODE $INP_FILE > ${INP_FILE%.inp}.out.$PBS_JOBID 2>&1

  • On lance le calcul avec qsub. qstat -Jt permet d'avoir l'état de chaque sous-calculs.
    [user@thor]$ qsub array.pbs
    429505[].thor
    [user@thor]$ qstat -Jt
    Job id            Name             User              Time Use S Queue
    ----------------  ---------------- ----------------  -------- - -----
    429505[0].thor    array          user                 0 X small
    429505[1].thor    array          user                 0 X small
    429505[2].thor    array          user          00:00:00 R small
    429505[3].thor    array          user          00:00:00 R small
    429505[4].thor    array          user                 0 R small
    429505[5].thor    array          user                 0 Q small