如何在Slurm集群中充分利用节点核心并行运行多单核心任务?
Slurm集群并行化单核心任务的优化方案
问题描述
我有如下串行csh脚本:
foreach n (`seq 1 1000000`) ./myprog${n}.x end
希望将其在Slurm集群上并行运行,每个程序实例仅需1个核心,让多个节点同时执行多个任务。我编写了并行脚本:
#!/bin/csh #SBATCH --nodes=8 #SBATCH -n 1024 #SBATCH --ntasks-per-node=128 foreach n (`seq 1 1000000`) srun -N 1 -n 1 ./myprog${n}.x & end wait
但运行时每个节点似乎一次只能运行1个任务,无法充分利用申请的所有核心,该如何调整?
优化方案
1. 修正srun的节点绑定限制
你当前使用的srun -N 1 -n 1强制每个任务独占一个节点,这是导致单节点仅运行1个任务的核心原因。去掉-N 1参数,让Slurm自动在已分配的8个节点上调度任务,同时添加--exact确保每个任务只占用1个核心:
foreach n (`seq 1 1000000`) srun -n 1 --exact ./myprog${n}.x & end wait
2. 强化Slurm资源配置(可选)
在#SBATCH头中添加--exclusive参数,确保分配给你的节点不会被其他作业共享,避免资源抢占:
#!/bin/csh #SBATCH --nodes=8 #SBATCH -n 1024 #SBATCH --ntasks-per-node=128 #SBATCH --exclusive
3. 使用Slurm数组任务(推荐方案)
循环启动100万个后台进程会带来较高的系统开销,Slurm的**作业数组(Job Array)**是更高效的管理方式,它会自动调度任务到空闲核心,无需手动管理后台进程:
#!/bin/csh #SBATCH --nodes=8 #SBATCH -n 1024 #SBATCH --ntasks-per-node=128 #SBATCH --array=1-1000000%1024 ./myprog${SLURM_ARRAY_TASK_ID}.x
其中%1024设置了同时运行的任务上限,刚好匹配你申请的核心总数,Slurm会自动批量调度所有任务,最大化资源利用率。
验证资源利用情况
可以通过以下命令确认资源是否被充分利用:
- 查看作业任务分布:
squeue -l -j $SLURM_JOB_ID - 在节点上查看核心占用:
htop或sinfo -N -l
内容的提问来源于stack exchange,提问作者byrdman1982
相关产品推荐
相关产品推荐

