我有一个带有变化的输入参数的程序,应该在程序中执行相同的功能。如何使每组输入参数在网格中的不同处理器上工作。如果您有任何想法,请帮助。真的有很大帮助!程序使用C++
最佳答案
这取决于您使用的群集资源管理器。大多数支持所谓的数组作业,其中运行同一作业的许多实例,并且参数(通常是当前作业的简单整数索引)通过环境传递。那就是我们所说的穷人的并行计算平台:)
由于我仅广泛使用了Sun Grid Engine(现在是Oracle Grid Engine,还存在名为Open Grid Scheduler和Son of Grid Engine的开源 fork )和Platform LSF(现在是IBM LSF,也可以作为非常相似的开源openlava作业调度程序使用) ,我只能写关于它们的内容(在某种程度上也可以写关于扭矩的内容)。
使用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}
此处
-t 1-100
的qsub
参数创建了一个包含100个任务的数组作业,编号为1
至100
。 SGE在SGE_TASK_ID
环境变量中传递当前任务号。您可以使用它来选择适当的输入文件,也可以使用它来计算其他输入参数。 SGE将自动为作业的输出和错误文件添加后缀任务ID。请注意,在$(())
中使用浮点文字似乎是zsh
特定的。通过
-t
参数,以与使用SGE完全相同的方式创建Torque中的阵列作业。对于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情况完全相同的方式使用它。关于c++ - 在不同处理器中改变输入参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15198734/