我有一个具有不同输入参数的程序,应该在程序中执行相同的功能。如何使每组输入参数在网格中的不同处理器上工作。如果您有任何小想法,请提供帮助。真的会有很大帮助!程序是 C++
2 回答
这取决于您使用的集群资源管理器。大多数支持所谓的数组作业,其中运行同一作业的许多实例,并且通过环境传递参数,通常是当前作业的简单整数索引。这就是我们所说的穷人的并行计算平台:)
因为我只广泛使用过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}
这里的-t 1-100
参数qsub
创建一个包含 100 个任务的数组作业,编号从1
到100
。SGE_TASK_ID
SGE 在环境变量中传递当前任务号。您可以使用它来选择适当的输入文件,也可以使用它来计算其他输入参数。SGE 将自动使用任务 ID 为作业的输出和错误文件添加后缀。请注意,使用浮点文字 in$(())
似乎是zsh
特定的。
-t
Torque 中的阵列作业的创建方式与 SGE 通过参数创建的方式完全相同。对于 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
. 请参阅扭矩手册中的作业提交部分。
使用 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 案例完全相同的方式使用它。
您需要指定使用的并行范例。MPI、OpenMP 等等。
通常应用的方法是使用一些通信通道并将参数向量从“主”进程发送到所有其他进程。
当参数相同时最常见的是广播参数,但主任务可以迭代一组参数,并通过一对一的通信器将每个参数发送给其他任务。
有时参数是在一个或一组文件中准备的,每个任务都会读取它自己的设置参数。
一切都取决于您的应用程序部署的站点和工作的规模。即,当您在超级计算机上有 100 万个任务时,文件方法可能不是一个好主意。