Springe direkt zu Inhalt

Job-Array

Einleitung

Für eine große Zahl von Jobs, die durch eine einzelne ganze Zahl parametrisiert werden können, sollte man ein Job-Array verwenden.  Dies hat den Vorteil, dass wartende Jobs, die Teil eines Arrays sind, von Programmen wie squeue zusammengefasst werden können.  Damit wird die Liste der wartenden Jobs wesentlich übersichtlicher.

Ein Job-Array wird folgendermaßen abgeschickt:

sbatch --array=1-20 my_script.sh

Für jeden Wert, der durch die Option --array spezifiziert wird, wird die Variable ${SLURM_ARRAY_TASK_ID} im Skript durch diesen Wert ersetzt. Die maximale Array-Größe ist 5001.

Einfaches Beispiel

Im einfachsten Fall wird der Array-Index als Parameter direkt an das Programm gegen:

#!/bin/bash

#SBATCH --job-name=my_job_array                 # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de  # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1                              # replace with value for your job
#SBATCH --mem-per-cpu=4096                      # replace with value for your job
#SBATCH --time=08:00:00                         # replace with value for your job
#SBATCH --qos=standard                          # replace with value for your job

module add ExampleProg/1.2.3-foss-2018b         # replace with value for your job

cd /scratch/${USER}                             # replace with your directory
exampleprog ${SLURM_ARRAY_TASK_ID}              # replace with your program

Einfaches Beispiel mit Nicht-Integer-Parametern

Im Falle von nicht ganzahligen Parametern wird ein Array mit den Parametern definiert und dann der Array-Index benutzt, um den einzelnen Parameter auszuwählen:

#!/bin/bash

#SBATCH --job-name=my_job_array                 # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de  # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1                              # replace with value for your job
#SBATCH --mem-per-cpu=4096                      # replace with value for your job
#SBATCH --time=08:00:00                         # replace with value for your job
#SBATCH --qos=standard                          # replace with value for your job

module add ExampleProg/1.2.3-foss-2018b         # replace with value for your job

declare -a fruit
fruit=(apple banana cherry damson)

cd /scratch/${USER}                             # replace with your directory
exampleprog ${fruit[${SLURM_ARRAY_TASK_ID}]}    # replace with your program

Multiparameter-Beispiel

Es kann aber auch ein Array von Parameterkombinationen erstellt werden und der Array-Index verwendet werden, um eine bestimmte Kombination auszuwählen:

#!/bin/bash

#SBATCH --job-name=my_job_array                 # replace name
#SBATCH --mail-user=example@zedat.fu-berlin.de  # replace email address
#SBATCH --mail-type=end
#SBATCH --nodes=1
#SBATCH --ntasks=1                              # replace with value for your job
#SBATCH --mem-per-cpu=4096                      # replace with value for your job
#SBATCH --time=08:00:00                         # replace with value for your job
#SBATCH --qos=standard                          # replace with value for your job

declare -a combinations
index=0
for run in `seq 1 10`
do
    for direction in 'north' 'south' 'east' 'west'
    do
        for size in 7 11 19 33 112
        do
            combinations[$index]="$run $direction $size"
            index=$((index + 1))
        done
    done
done

parameters=(${combinations[${SLURM_ARRAY_TASK_ID}]})

run=${parameters[0]}
direction=${parameters[1]}
size=${parameters[2]}

module add ExampleProg/1.2.3-foss-2018b         # replace with value for your job

cd /scratch/${USER}                             # replace with your directory
exampleprog ${run} ${direction} ${size}