1

我有一个具有不同输入参数的程序,应该在程序中执行相同的功能。如何使每组输入参数在网格中的不同处理器上工作。如果您有任何小想法,请提供帮助。真的会有很大帮助!程序是 C++

4

2 回答 2

1

这取决于您使用的集群资源管理器。大多数支持所谓的数组作业,其中运行同一作业的许多实例,并且通过环境传递参数,通常是当前作业的简单整数索引。这就是我们所说的穷人的并行计算平台:)

因为我只广泛使用过Sun Grid Engine(现在是Oracle Grid Engine ,也存在名为Open Grid SchedulerSon 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 个任务的数组作业,编号从1100SGE_TASK_IDSGE 在环境变量中传递当前任务号。您可以使用它来选择适当的输入文件,也可以使用它来计算其他输入参数。SGE 将自动使用任务 ID 为作业的输出和错误文件添加后缀。请注意,使用浮点文字 in$(())似乎是zsh特定的。

-tTorque 中的阵列作业的创建方式与 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 案例完全相同的方式使用它。

于 2013-03-04T11:55:33.433 回答
0

您需要指定使用的并行范例。MPI、OpenMP 等等。

通常应用的方法是使用一些通信通道并将参数向量从“主”进程发送到所有其他进程。

当参数相同时最常见的是广播参数,但主任务可以迭代一组参数,并通过一对一的通信器将每个参数发送给其他任务。

有时参数是在一个或一组文件中准备的,每个任务都会读取它自己的设置参数。

一切都取决于您的应用程序部署的站点和工作的规模。即,当您在超级计算机上有 100 万个任务时,文件方法可能不是一个好主意。

于 2013-03-04T09:58:29.747 回答