迭代 slurm 作业

Iterative slurm job

我正在尝试优化我正在进行的一项研究。我目前必须编写作业脚本,我称它们为 step1 和 step2。在步骤 1

#!/bin/bash

#SBATCH --output=slurm-%j.out
#SBATCH --nodes=16
#SBATCH --ntasks-per-node=28
#SBATCH --time=24:00:00

module load <everything I need>



echo "Start of program at `date`"

srun $HOME/project/bin/my_executable1 ../data/my_datafile0.dat

echo "End of program at `date`"

这项工作完成后,我有一个新的数据文件,我们可以调用它 my_datafile1.dat,这将进入第二个工作脚本步骤 2:

#!/bin/bash

#SBATCH --output=slurm-%j.out
#SBATCH --nodes=16
#SBATCH --ntasks-per-node=28
#SBATCH --time=24:00:00

module load <everything I need>



echo "Start of program at `date`"

srun $HOME/project/bin/my_executable1 ../data/my_datafile1.dat

echo "End of program at `date`"

完成这项工作后,我有一个名为 my_datafile2.dat 的新数据文件,我在第 1 步中再次使用它,然后在第 2 步中使用新数据文件等。我想知道是否有一种方法可以编写一个作业脚本这次迭代对我来说。我想告诉它进行 20 次迭代,然后我将得到 my_datafile1.dat、my_datafile2.dat、...、my_datafile20.dat.

在一份工作中?如果是这样,您可以只使用一个循环,如下所示(内部循环有点冗长,但如果需要可以用一行替换)。

在下面的评论中澄清后编辑:基本上一步是执行 my_executable1,然后执行 my_executable2。为简化起见,我们将 A 称为 1 的输出,将 B 称为 2 的输出:

#!/bin/bash

#SBATCH --output=slurm-%j.out
#SBATCH --nodes=16
#SBATCH --ntasks-per-node=28
#SBATCH --time=24:00:00

module load <everything I need>

echo "Start of program at `date`"

for I in $(seq 10); do
  CMD="srun $HOME/project/bin/my_executable1 ../data/my_datafile_A_${I}.dat"
  echo "Launching command \"$CMD\" at $(date)"
  eval $CMD
  CMD="srun $HOME/project/bin/my_executable2 ../data/my_datafile_B_${I}.dat"
  echo "Launching command \"$CMD\" at $(date)"
  eval $CMD
done

echo "End of program at `date`"

如果出于某种原因你真的想要在每个子步骤增加索引,你可以使用bc进行小的计算:

#!/bin/bash

#SBATCH --output=slurm-%j.out
#SBATCH --nodes=16
#SBATCH --ntasks-per-node=28
#SBATCH --time=24:00:00

module load <everything I need>

echo "Start of program at `date`"

for I in $(seq 10); do
  INDEX=$(echo "2*$I-1" | bc)
  CMD="srun $HOME/project/bin/my_executable1 ../data/my_datafile_${INDEX}.dat"
  echo "Launching command \"$CMD\" at $(date)"
  eval $CMD
  INDEX=$(echo "2*$I" | bc)
  CMD="srun $HOME/project/bin/my_executable2 ../data/my_datafile_${INDEX}.dat"
  echo "Launching command \"$CMD\" at $(date)"
  eval $CMD
done

echo "End of program at `date`"