我有一个具有不同输入参数的程序,它应该在程序中执行相同的功能。如何使每组输入参数在网格中的不同处理器上工作。如果您有任何想法,请帮忙。真的会帮到很多!程序是用C ++编写的
答案 0 :(得分:1)
这取决于您使用的群集资源管理器。大多数支持所谓的阵列作业,其中运行相同作业的许多实例,并且通过环境传递参数(通常是当前作业的简单整数索引)。这就是我们所说的穷人的并行计算平台:)
由于我只广泛使用了 Sun Grid Engine (现在是 Oracle Grid Engine ,也是名为Open Grid Scheduler和{{3的开源分支机构存在)和 Platform LSF (现在是IBM LSF,也可以作为非常相似的开源Son of Grid Engine作业调度程序使用),我只能写它们(在某种程度上关于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}
此处-t 1-100
qsub
参数创建了100个任务的数组作业,编号从1
到100
。 SGE传递SGE_TASK_ID
环境变量中的当前任务编号。您可以使用它来选择适当的输入文件,也可以使用它来计算其他输入参数。 SGE将使用任务ID自动为作业的输出和错误文件添加后缀。请注意,在$(())
中使用浮点文字似乎是zsh
- 具体。
Torque中的阵列作业的创建方式与通过-t
参数的SGE完全相同。使用2.3 -t
之前的Torque版本接受一个参数 - 任务数量,然后将任务从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
。请参阅Torque手册中的openlava部分。
使用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情况完全相同的方式使用它。
答案 1 :(得分:0)
您需要指定您使用的并行范例。 MPI,OpenMP,其他。
通常应用的方法是使用一些通信通道并从“主”过程向所有其他过程发送参数向量。
最常见的是广播参数相同,但主要任务可以迭代一组参数,并通过1对1通信器将每个参数发送给彼此。
有时参数是在一个或一组文件中准备的,每个任务都会读取它自己的设置参数。
一切都取决于您的应用程序部署的站点和作业的规模。即当你在超级计算机上有一百万个任务时,文件方法可能是一个坏主意。