这取决于您使用的集群资源管理器。大多数支持所谓的数组作业,其中运行同一作业的许多实例,并且通过环境传递参数,通常是当前作业的简单整数索引。这就是我们所说的穷人的并行计算平台:)
由于我只广泛使用过 Sun Grid Engine(现在 Oracle Grid Engine,还存在名为 Open Grid Scheduler 和 Son of Grid Engine 的开源分支)和 Platform LSF(现在是 IBM LSF,也可作为非常相似的开源 openlava 作业调度程序),我只能写关于它们(以及在某种程度上关于 Torque)。
使用 SGE,数组作业可能如下所示:
#!/usr/bin/env zsh
#$ -cwd
#$ -N jobname
#$ -t 1-100
## Other resource requirements
#$ -l h_rt=0:30:00
#$ -l h_mem=1200M
#$ -pe openmp 12
export OMP_NUM_THREADS=12
density=$((SGE_TASK_ID * 0.06)) # zsh specific
/path/to/executable -d density < input_${SGE_TASK_ID} > output_${SGE_TASK_ID}
此处qsub 的-t 1-100 参数创建了一个包含100 个任务的数组作业,编号从1 到100。 SGE 在SGE_TASK_ID 环境变量中传递当前任务号。您可以使用它来选择适当的输入文件,也可以使用它来计算其他输入参数。 SGE 将自动使用任务 ID 为作业的输出和错误文件添加后缀。请注意,在 $(()) 中使用浮点文字似乎是 zsh 特定的。
Torque 中的阵列作业的创建方式与 SGE 完全相同,通过 -t 参数创建。对于 2.3 之前的 Torque 版本,-t 接受一个参数 - 任务数,然后将任务数从 0 到该数字减 1。从 Torque 2.3 开始,可以像 SGE 一样指定范围:
#!/usr/bin/env zsh
#PBS -N jobname
#PBS -l nodes=1,walltime=00:30:00
#PBS -t 1-100
cd ${PBS_O_WORKDIR}
export OMP_NUM_THREADS=12
density=$((PBS_ARRAYID * 0.06)) # zsh specific
/path/to/executable -d density < input_${PBS_ARRAYID} > output_${PBS_ARRAYID}
与 SGE 的主要区别在于任务 ID 环境变量名为 PBS_ARRAYID。请参阅扭矩手册中的Job Submission 部分。
使用 LSF,数组作业可能如下所示:
#!/usr/bin/env zsh
#BSUB -J jobname[1-100]
# Have separate error file for each job
#BSUB -e error_%I
# Other resource requirements, e.g.
#BSUB -W 0:30
#BSUB -M 1200
#BSUB -n 1
#BSUB -x
export OMP_NUM_THREADS=12
density=$((LSF_JOBINDEX * 0.06)) # zsh specific
/path/to/executable -d density < input_${LSF_JOBINDEX} > output_${LSF_JOBINDEX}
此处在作业名称后附加范围规范[1-100] 创建一个数组作业。 LSF 通过LSF_JOBINDEX 环境变量传递任务ID。您可以像在 SGE 案例中一样使用它。