迭代 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`"
我正在尝试优化我正在进行的一项研究。我目前必须编写作业脚本,我称它们为 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`"