Macros de linha de comando em comentários usando o SLURM

3

Na minha opinião, os comentários são comentários são comentários. Eles nunca devem mudar o estado do programa. Infelizmente, as pessoas em SLURM não concordam.

O SLURM requer que a seguinte sintaxe (ou algo similar) exista na frente de um arquivo .sh:

#!/bin/bash

#SBATCH --time=5:00:00    
#SBATCH --ntasks=8
#SBATCH --mem-per-cpu=1024M

MyProgram.exe

O texto acima enviará uma solicitação para executar o programa MyProgram.exe usando 8 processadores no super computador da minha escola. No momento, estou comparando meu código e gostaria de usar um argumento de linha de comando para alterar o número de processadores. Efetivamente, eu quero fazer o seguinte

#!/bin/bash

#SBATCH --time=5:00:00    
#SBATCH --ntasks=%1
#SBATCH --mem-per-cpu=1024M

MyProgram.exe

onde %1 seria um argumento de linha de comando. Eu chamaria então como sbatch myShScript.sh 123 , o que usaria 123 processadores. Isso, obviamente, não funciona porque o bash interpreta a linha #SBATCH --ntasks=%1 como um comentário (o que é) e nunca substitui o argumento da linha de comando.

Existe uma maneira de enganar o SLURM ou o BASH para subutilizar o argumento da linha de comando?

    
por chessofnerd 25.11.2014 / 00:31

1 resposta

4

Todo o processamento feito pelo SLURM (por sbatch , especificamente) é feito antes do bash invocado, então o bash não vai te ajudar aqui. O script poderia estar em qualquer idioma, não importaria: os #SBATCH são apenas coincidentemente comentários bash, o que importa é que eles são sbatch diretivas.

As opções podem ser especificadas no arquivo para fornecer uma maneira conveniente de sempre usar os mesmos parâmetros para um script específico. Se você quiser usar opções diferentes, passe-as na linha de comando de sbatch . Você pode escrever um script de wrapper que execute sbatch se desejar criar opções a partir de determinados parâmetros específicos. Você pode passar o script de trabalho como entrada padrão (um documento aqui é conveniente) em vez de mantê-lo em um arquivo separado se você preferir.

#!/bin/sh
sbatch --time=5:00:00 --ntasks="$1" --mem-per-cpu=1024M <<'EOF'
#!/bin/sh
MyProgram.exe
EOF
    
por 25.11.2014 / 00:41