我正在基于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,而不管其他实例的状态如何。
最好的问候,亚当
答案 0 :(得分:1)
GNU Parallel
似乎可以很好地处理这个问题。如果我理解正确,您希望为给定文件顺序运行hexp
后跟partit
。您希望序列并行运行多个文件。我想您会想要使用GNU Parallel
,如下所示:
首先,创建一个接受filename参数的简单bash脚本并启动这两个命令:
#!/bin/bash
hexp -batch -project $1 ; partit -batch -project $1
#name this file hexpart.sh and make it executable
接下来,在PBS脚本中使用GNU Parallel
在多个CPUS上启动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.pbs
,parallel
命令将在八个文件上运行hexpart.sh,每个文件位于一个单独的CPU上。将使用{}
之后的参数替换:::
来生成文件名。这是一个tutorial for GNU Parallel。
答案 1 :(得分:0)
您正在寻找的是工作依赖性。让我们说你的预处理命令放在一个名为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.
中详细了解有关作业相关性的信息