3

我在基于 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

其中 hep 是网格划分程序!

我还可以运行网格任务,然后通过运行进行分区:

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

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

最好的问候,亚当

4

2 回答 2

1

看起来这个问题会被GNU Parallel. 如果我理解正确,您希望依次运行hexppartit定文件。您希望序列对多个文件并行运行。我想你会想使用GNU Parallel如下:

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

#!/bin/bash
hexp -batch -project $1 ; partit -batch -project $1

#name this file hexpart.sh and make it executable

接下来,GNU Parallel在您的 PBS 脚本中使用以hexpart.sh在多个 CPU 上启动。在这种情况下,一个节点上 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 上。{}将通过将 替换为之后的参数来生成文件名:::。这是GNU Parallel 的教程

于 2014-03-18T20:30:39.013 回答
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 个作业,除非第一个作业以退出代码 0 退出,否则这些作业不会执行。如果您让预处理脚本将结果输出到所有计算节点都可以读取的网络文件位置,并且您将 partition.sh 脚本设置为从同一位置读取,这将很好地工作。

您可以在文档中阅读有关作业依赖性的更多信息

于 2014-03-17T23:06:35.290 回答