任务
在使用该命令在远程计算机上启动的 M 个作业/命令列表中srun
,确保始终有 N 个任务正在运行或请求 (N<=M),直到所有 M 个作业都已启动。
动机
(包括在内,因为它可能会引起其他建议)。我必须运行一组模拟,目前我通过两步过程来完成。这两个步骤都基于包含MSTR_FILE
有关模拟的基本信息:
- 第一步:根据 的内容
MSTR_FILE
,创建模拟所需的目录和文件 - 第二步:根据 的内容
MSTR_FILE
,现在为文件中的每个条目启动一个作业
第二步的基本循环如下所示:
for d in $(cat $MSTR_FILE | cut -d " " -f 1);do
cd $d
srun -p My_Queue $(cat sim_command_file)&
cd ..
done
这工作正常,但是我的模拟设置 ( MSTR_FILE
) 最终有 50 到 100 个条目,甚至可能更多。这样的循环只会遍历整个列表并获取资源,直到列表本身的末尾。在共享资源环境中,这并不是真正理想的:)
我的部分工作解决方案
我对脚本进行了修改,基本上wait
直到完成一定数量的作业为止。脚本的相关部分如下所示:
N=10
swp_list=($(cat $MSTR_FILE | cut -d " " -f 1))
cnt=0
list_size=$(#{swp_list[@]})
while [ $cnt -lt $list_size ];do
for i in $(seq 0 $N);do
ix=$(($cnt+$i))
if [ $ix -lt $list_size ];then
d=${swp_list[ix]}
cd $d
srun -p My_Queue $(cat sim_command_file)&
cd ..
fi
done
wait
((cnt+=$N))
done
据我测试,这种方法似乎工作得很好,因为N
一次只启动作业。然而,它也有一个严重的缺点:有时并非所有请求的作业都会N
同时启动。其中一些作业在分配节点之前会等待很长时间。即使情况并非如此,某些模拟任务也可能需要比其他任务更长的时间,甚至显着延长。
我的部分工作解决方案无法解决任何问题:它只是等待N
数据包中的所有作业完成。然而,我希望有一种queue
总是充满下一个工作的内容MSTR_FILE
,这样就不会浪费时间。