0

所以我有一个 sbatch(slurm 作业调度程序)脚本,我在其中通过 3 个脚本处理大量数据:foo1.sh、foo2.sh 和 foo3.sh。

foo1.sh 和 foo2.sh 是独立的,我想同时运行它们。foo3.sh 需要 foo1.sh 和 foo2.sh 的输出,所以我正在构建一个依赖项。然后我必须重复 30 次。

让我们说:

## Resources config
#SBATCH --ntasks=30
#SBATCH --task-per-core=1

for i in {1..30};
do
    srun -n 1 --jobid=foo1_$i ./foo1.sh &
    srun -n 1 --jobid=foo2_$i ./foo2.sh &
    srun -n 1 --jobid=foo3_$i --dependency=afterok:foo1_$1:foo2_$i ./foo3.sh &
done;
wait

这个想法是您启动 foo1_1 和 foo2_1 但由于 foo3_1 必须等待其他两个作业完成,我想进行下一次迭代。下一次迭代将启动 foo1_2 foo2_2 并且 foo3_2 将等待等等。

在某个时候,使用 srun 启动的子作业的数量将高于 --ntasks=30。会发生什么?它会等待之前的工作完成(我正在寻找的行为)吗?

谢谢

4

2 回答 2

3

Slurm 将运行 30srun次,但第 31 次将等待在您的 30 核分配中释放一个核心。请注意,正确的参数是--ntasks-per-core=1,而不是--tasks-per-core=1

您可以使用 salloc 而不是 sbatch 自己测试它以交互方式工作:

$ salloc --ntasks=2 --ntasks-per-core=1
$ srun -n 1 sleep 10 & srun -n 1 sleep 10 & time srun -n 1 echo ok
[1] 2734
[2] 2735
ok
[1]-  Done                    srun -n 1 sleep 10
[2]+  Done                    srun -n 1 sleep 10

real    0m10.201s
user    0m0.072s
sys 0m0.028s

您会看到 simpleecho需要 10 秒,因为第三个srun必须等到前两个完成,因为分配只有两个内核。

于 2014-11-08T21:23:21.407 回答
0

应该发生的是,如果您启动的子任务多于核心或超线程,那么操作系统调度算法应该处理任务的优先级。根据您正在运行的操作系统(即使它们都是基于 Unix 的),在后台实现的方式也会有所不同。

但是您的假设是正确的,即如果您的内核用完,那么您的并行任务在某种意义上必须“等待轮到他们”。

于 2014-11-08T00:37:40.057 回答