Tablice zadań (ang. array job) są pomocne w przypadku chęci wykonania tego samego skryptu z różnymi parametrami (tzw. parameter sweep). Skrypty będą wykonane jednocześnie na różnych węzłach, a wyniki są zapisywane w różnych plikach.
Przykładowy skrypt arrayjob.sh
wypisujący losowo wygenerowaną liczbę od 1 do 50:
#!/bin/bash
#SBATCH -N1
#SBATCH -c5
#SBATCH --mem=250
#SBATCH -t1
# Generuj losową liczbę z zakresu 1-50
rand=`shuf -i 1-50 -n 1`
# Wypisuj generowaną liczbe do pliku
echo "Generowaną liczbę to: ${rand}"
i zgłosić zadanie do kolejki poleceniem
abcd@ui: ~>sbatch --array=1-3 arrayjob.sh
W wyniku wykonania skryptu powstają 3 pliki
abcd@ui: ~>ls
slurm-581784_1.out slurm-581784_2.out slurm-581784_3.out
abcd@ui: ~>more slurm-*
::::::::::::::
slurm-581784_1.out
::::::::::::::
Generowaną liczbę to: 47
::::::::::::::
slurm-581784_2.out
::::::::::::::
Generowaną liczbę to: 37
::::::::::::::
slurm-581784_3.out
::::::::::::::
Generowaną liczbę to: 32
Kolejny przykład z wykorzystanie Pythona. argument.py
import sys
print(int(sys.argv[1])**2)
Następnie należy sporządzić odpowiedni skrypt zadania arrayjob.sh
, na przykład
#!/bin/bash
#SBATCH -N1
#SBATCH -c5
#SBATCH --mem=250
#SBATCH -t1
#SBATCH --array=1-5 # lista ID podzadań
module load Python
python3 argument.py $SLURM_ARRAY_TASK_ID
i zgłosić zadanie do kolejki poleceniem
sbatch arrayjob.sh
Takie zadanie zwróci 5 plików o domyślnym formacie nazw JOBID_TASKID.out
, a w każdym z nich zawarty będzie kwadrat liczby odpowiadającej numerze ID podzadania. W ogólności tablica zadań nie musi być iterowana co jeden. Iterator może zostać podany po znaku :
. Przykładowa tablica od 1 do 10 z iteratorem o wartości 2 będzie zapisana jako --array=1-10:2
.
Zadanie tablicowe posiada kilka dodatkowych zmiennych środowiskowych.
Zmienna | Opis |
---|---|
SLURM_ARRAY_JOB_ID |
JOBID pierwszego zadania w tablicy |
SLURM_ARRAY_TASK_ID |
liczba równa wartości indeksującej podzadanie |
SLURM_ARRAY_TASK_COUNT |
całkowita liczba zadań w tablicy |
SLURM_ARRAY_TASK_MAX |
indeks ostatniego zadania w tablicy |
SLURM_ARRAY_TASK_MIN |
indeks pierwszego zadania w tablicy |
W podanym wcześniej przykładzie z argumentem SLURM_ARRAY_JOB_ID
jest równe wartości 177
, co odpowiada też zapisowi 177_1
. Wartość zmiennej SLURM_JOB_ID
dla kolejnych zadań w tablicy będzie przypisana w formie niezawierającej tablicowego indeksu zadania, czyli
Wartość SLURM_ARRAY_TASK_MIN
będzie równa 1, SLURM_ARRAY_TASK_MAX = 9
, a SLURM_ARRAY_TASK_COUNT = 5
.