【问题标题】:Running multiple serially dependent jobs in parallel并行运行多个串行依赖的作业
【发布时间】:2014-03-15 16:42:38
【问题描述】:

我正在基于 PBS 的集群上运行一些 CFD 模拟。我将运行大量案例,因此想在集群节点上进行预处理。我需要做两步,首先进行网格划分,当网格划分完成后,我想运行网格划分例程。 为了避免手动工作,我想在 pbs jobscript 中对此进行编程。

我可以通过运行以下命令并行运行所有案例的网格划分:

#!/usr/bin/env bash
#PBS -q regular
#PBS -l nodes=1:ppn=8
#PBS -N prep_tst_2
#PBS -l walltime=6:00:00

cd $PBS_O_WORKDIR

hexp -batch -project tst_1.igg &
hexp -batch -project tst_2.igg &
hexp -batch -project tst_3.igg &
hexp -batch -project tst_4.igg &
hexp -batch -project tst_5.igg &
hexp -batch -project tst_6.igg &
hexp -batch -project tst_7.igg &
hexp -batch -project tst_8.igg &

#End of script

其中 hexp 是网格划分程序!

我还可以运行网格划分任务,然后运行:

hexp -batch -project tst_1.igg ; partit -batch -project tst_1.igg

但是我怎样才能将两者结合起来呢? 我想并行运行最后一个命令的 8 个实例,以便随着 tst_1.igg 的网格化完成,无论其他实例的状态如何,它都会继续对 tst_1.igg 进行分区。

最好的问候,亚当

【问题讨论】:

    标签: cluster-computing hpc pbs gnu-parallel


    【解决方案1】:

    看来GNU Parallel 可以很好地解决这个问题。如果我理解正确,您希望对给定文件依次运行hexp,然后是partit。您希望序列对多个文件并行运行。我想你会想使用GNU Parallel 如下:

    首先,创建一个接受文件名参数并启动两个命令的简单 bash 脚本:

    #!/bin/bash
    hexp -batch -project $1 ; partit -batch -project $1
    
    #name this file hexpart.sh and make it executable
    

    接下来,在 PBS 脚本中使用 GNU Parallel 在多个 CPU 上启动 hexpart.sh。在这种情况下,一个节点上 8 个 CPU 上的 8 个文件:

    #!/bin/bash
    #PBS -l nodes=1:ppn=8
    #Other PBS directives
    
    cd $PBS_O_WORKDIR
    module load gnu-parallel   # this will depend on your cluster setup
    
    parallel -j8 --sshloginfile $PBS_NODEFILE --workdir $PBS_O_WORKDIR \
      `pwd`/hexpart.sh tst_{}.igg' ::: 1 2 3 4 5 6 7 8
    
    #name this file launch.pbs
    

    然后运行qsub launch.pbsparallel 命令将在八个文件上运行 hexpart.sh,每个文件都在一个单独的 CPU 上。将通过将{} 替换为::: 之后的参数来生成文件名。这是tutorial for GNU Parallel

    【讨论】:

    • 如果您使用 Bash,请考虑使用函数。这样您就可以避免使用 hexpart.sh 文件: hexpart() { hep -batch -project $1 ; partit -batch -project $1; };导出 -f 十六进制;并行 --env hexpart ...
    【解决方案2】:

    您正在寻找的是工作依赖关系。假设您的预处理命令被放置在一个名为 preprocess.sh 的脚本中,而您想要运行 8 次的分区片段被放置在一个名为 partition.sh 的脚本中

    jobid=`qsub preprocess.sh`
    for ((i=0; i < 8; i++)); do
      qsub partition.sh -W depend=afterok:$jobid
    done
    

    这使 preprocess.sh 脚本成为一个作业,然后提交 8 个作业,除非第一个作业以零退出代码退出,否则这些作业不会执行。如果您让预处理脚本将结果输出到所有计算节点都可以读取的网络文件位置,并且您将 partition.sh 脚本设置为从同一位置读取,这将很好地工作。

    您可以在documentation. 中阅读有关作业依赖关系的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2014-01-25
      • 2023-03-29
      • 2022-09-23
      相关资源
      最近更新 更多