SLURM:如何在同一计算节点或不同节点上并行运行不同的可执行文件?

时间:2016-11-03 23:16:29

标签: mpi executable job-scheduling slurm sbatch

目标:

  1. 了解如何使用sbatch作业提交运行或共同安排或执行可执行文件/应用程序
  2. 使用srun或mpirun
  3. 研究:

    代码段:

     #!/bin/bash
     #SBATCH --job-name LEBT 
     #SBATCH --partition=angel
     #SBATCH --nodelist=node38
     #SBATCH --sockets-per-node=1
     #SBATCH --cores-per-socket=1
     #SBATCH --time 00:10:00 
     #SBATCH --output LEBT.out
    
     # the slurm module provides the srun command
     module load openmpi
    
    
     srun  -n 1   ./LU.exe -i 100 -s 100  &
     srun  -n 1   ./BT.exe  &
    
     wait 
    

    手册页:

     [srun]-->[https://computing.llnl.gov/tutorials/linux_clusters/man/srun.txt]
    
     [mpirun]-->[https://www.open-mpi.org/doc/v1.8/man1/mpirun.1.php]
    

2 个答案:

答案 0 :(得分:2)

您的脚本将以微调方式进行修改。如果您不关心流程是否在同一节点上运行,请添加#SBATCH --ntasks=2

#!/bin/bash
#SBATCH --job-name LEBT 
#SBATCH --ntasks=2
#SBATCH --partition=angel
#SBATCH --nodelist=node38
#SBATCH --sockets-per-node=1
#SBATCH --cores-per-socket=1
#SBATCH --time 00:10:00 
#SBATCH --output LEBT.out

# the slurm module provides the srun command
module load openmpi

srun  -n 1 --exclusive  ./LU.exe -i 100 -s 100  &
srun  -n 1 --exclusive  ./BT.exe  &

wait 

--exclusive的{​​{1}}参数告诉srun使用整个分配的子集运行,请参阅srun manpage

如果您希望在sam节点上运行这两个进程,请使用srun

--cpus-per-task=2

请注意,您必须使用#!/bin/bash #SBATCH --job-name LEBT #SBATCH --cpus-per-task=2 #SBATCH --partition=angel #SBATCH --nodelist=node38 #SBATCH --sockets-per-node=1 #SBATCH --cores-per-socket=1 #SBATCH --time 00:10:00 #SBATCH --output LEBT.out # the slurm module provides the srun command module load openmpi srun -c 1 --exclusive ./LU.exe -i 100 -s 100 & srun -c 1 --exclusive ./BT.exe & wait 而不是srun运行-c 1

答案 1 :(得分:0)

经过广泛研究后,我得出结论,“srun”是您要用于并行运行作业的命令。此外,您需要一个帮助程序脚本才能充分执行整个过程。我编写了以下脚本来在一个节点中执行应用程序,没有任何问题。

#!/usr/bin/python
#SBATCH --job-name TPython
#SBATCH --output=ALL.out
#SBATCH --partition=magneto
#SBATCH --nodelist=node1


import threading
import os

addlock = threading.Lock()

class jobs_queue(threading.Thread):
    def __init__(self,job):
            threading.Thread.__init__(self,args=(addlock,))
            self.job = job
    def run(self):
            self.job_executor(self.job)

    def job_executor(self,cmd):
            os.system(cmd)

if __name__ == __main__:

    joblist =  ["srun  ./executable2",
                "srun  ./executable1 -i 20 -s 20"]

    #creating a thread of jobs 
    threads = [jobs_queue(job)  for job in joblist]

    #starting jobs in the thread 
    [t.start() for t in threads]

    #no interruptions 
    [t.join()  for t in threads]

在我的特定情况下,激活特定标志的两个可执行文件每个都会产生大约55秒的时间。但是,当它们并行运行时,它们都会产生59秒的执行时间。