【问题标题】:Varying input parameters in different processors不同处理器中的不同输入参数
【发布时间】:2013-03-04 09:54:58
【问题描述】:

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

【问题讨论】:

  • “在网格中的不同处理器上工作”是什么意思?
  • 不同的处理器是指像Athlon-64和Intel iCore7,还是指PowerPC和x86?你想改变什么,为什么? [另一个XY问题,你正在尝试解决问题X,认为Y是解决方案,并询问如何做Y]
  • 我的意思是不同的处理器,网格环境中的不同节点。我正在尝试在各种计算机之间分配工作以进行快速计算。所以,我想让每组输入参数在每个节点上运行。我够清楚了吗?

标签: c++ parallel-processing grid openmpi


【解决方案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}

此处qsub-t 1-100 参数创建了一个包含100 个任务的数组作业,编号从1100。 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 案例中一样使用它。

【讨论】:

  • 感谢您这么好心给我答复。
  • 所以你是说在 SGE ARRAY JOBS 中,每个 SGE_TASK_ID 都可以在网格的不同节点上工作吗?还是我应该指定它在某处使用不同的节点?以及如何将 SGE_TASK_ID 与不同的任务一起使用来计算程序中的不同输入参数?
  • 提交和数组作业就像提交了许多具有相同作业文件的作业。 SGE 根据可用资源和单个作业实例的要求(在阵列作业中,所有实例具有相同的资源要求)来决定在何处执行每个实例。 SGE 为您提供工作编号,您必须将其翻译成有用的东西。我已经给你展示了一个例子。
  • 在 SGE 中,来自不同任务 ID 的所有输出文件是否默认收集在单个文件夹中,还是应该以某种方式提及?如果是这样,如何?你有什么书可以推荐给我一个详细的想法吗?会很有帮助,谢谢!
  • 每个任务的输出要么到主目录,要么到执行qsub的目录,这取决于是否指定了-cwd,并存储在一个后缀为任务标识。 Oracle Grid Engine documentation archive 是开始了解它的好地方。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 任务相同,但参数不同,需要运行相同的任务。请您用更简单的语言解释一下,我是编程初学者!
  • 程序已与 Open MP 并行化以使用节点中的所有线程。但现在我正试图让程序本身在不同的节点上运行。所以,如果我没记错的话,我们正在结合分布式内存和共享内存模型。
  • 您使用什么系统向网格节点发送任务?任务之间有通信吗?你似乎不知道发生了什么事。你说任务是相同的只是不同的参数。然后,我想他们之间没有沟通,引入它会有点矫枉过正。另一方面,您说您建议您使用分布式内存。是哪个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多