Skip to content

Job Arrays

Jobarrays are very useful for jobs where only parameters differ.

Example:
First assume we have a parameterlist, in “paramlist” text-file, like:

#Generated parameterlist to demonstrate job arrays.
#1st    2nd     3rd     4th
-s      A       100     100
-s      B       100     200
-s      C       100     300
-s      D       100     400
-s      E       200     100
-s      F       200     200
-s      G       200     300
-s      H       200     400
-s      I       300     400
-s      J       400     100
-s      K       400     200
-s      L       400     300
-s      M       400     400
#EOF

And program (e.g. ./example.sh) that takes these arguments:

#!/bin/bash

steptype="$1"
stepsize="$2"

arraysize=$( echo $3 * $4 | bc -l)

echo $arraysize

If we want to start our program with several of these parameter sets by a loop inside a single job we could run into several problems, e.g.:

  • exceeding maximum walltime and job gets killed
  • all of the output get stored in one file by default
  • no save state until job ended

To avoid these problems and iterate over these list with our example.sh we could use a job array. By example here for the first 10 parameters, this could be done by using an arrayjob with following script:

#!/bin/bash
#SBATCH --array=1-10  # Describe your array first
#SBATCH --job-name=job_array            
#SBATCH --nodes=1
#SBATCH --ntasks=1                               
#SBATCH --output=ex_%A_%a.out   # err/out file with <JOBID>_<JOBARRAY_INDEX>
#SBATCH --error=ex_%A_%a.err
#SBATCH --time=00:05:00

#Starting the example.sh script with <n>th parameter-set from list.
#Using "grep -v "^#" to ignore commentlines
line=${SLURM_ARRAY_TASK_ID}
./example.sh $( cat paramlist | grep -v "^#" | sed -ne ${line}p )
#EOF

this will start the “./example.sh” with th parameter of paramlist as follows:

$ ./example.sh -s      8       100     100
...
$ ./example.sh -s      8       300     200