Job array

Uma outra forma de paralelismo é conhecida como bag-of-tasks. Ela ocorre quando são executadas diversas simulações completamente independentes umas das outras. Esse caso ocorre com frequência quando se trabalha com um modelo parametrizado e são feitas simulações varrendo esses parâmetros ou em simulações repetidas para ganhar significância estatística, como em modelos de Monte Carlo.

Diferente de paralelizações com memória distribuída ou compartilhada, no caso de bag-of-tasks não é necessário nenhuma alteração de código.

Com o SLURM é possível criar apenas um único script de execução de jobs que iniciará programas com diferentes parâmetros ou arquivos de entrada. Isso é chamado de Job Array.

A opção --array permite que você especifique uma sequencia de valores que serão substituídos na variável de ambiente SLURM_ARRAY_TASK_ID. É possível passar uma lista de números (1,2,3,4), um intervalo (1-4) ou um intervalo com incrementos diferentes de 1, como em 1-10:3, que resulta em 1,4,7,10.

Essa variável pode ser usada como parâmetro na linha de comando. Em casos mais sofisticados, pode ser um índice em uma lista que contém o nome dos arquivos de entrada, quando esses não seguem uma regra simples.

Script de execução

#!/bin/bash
#SBATCH --array=1-7:2
# comentario: isso ee equivalente a --array=1,3,5,7

echo my ID is ${SLURM_ARRAY_TASK_ID}

Dependência entre jobs

Em muitos casos é necessário fazer algum pós processamento quando todos os jobs do Job Array terminarem. Por exemplo, gerar alguma estatística ou selecionar o caso com o melhor resultado.

Isso pode ser obtido com a opção --depend.

Por exemplo:

$ sbatch --depend=after:<job_id> my.job