5

如果我需要“并行”运行许多串行程序(因为问题简单但耗时 - 我需要为同一个程序读取许多不同的数据集),如果我只使用一个节点,解决方案很简单。我所做的就是在每个命令之后继续提交带有&符号的串行作业,例如在作业脚本中:

./program1 &
./program2 &
./program3 &
./program4

它自然会在不同的处理器上运行每个串行程序。这适用于登录服务器或独立工作站,当然也适用于只要求一个节点的批处理作业。

但是,如果我需要运行同一程序的 110 个不同实例来读取 110 个不同的数据集怎么办?如果我使用提交 110 ./program# 命令的脚本提交到多个节点(比如 14 个),批处理系统是否会在不同节点上的不同处理器上运行每个作业,或者它会尝试在相同的情况下运行它们, 8核节点?

我尝试使用简单的 MPI 代码来读取不同的数据,但会导致各种错误,110 个进程中约有 100 个成功,其他进程崩溃。我也考虑过作业数组,但我不确定我的系统是否支持它。

我已经在单个数据集上广泛测试了串行程序 - 没有运行时错误,并且我没有超出每个节点上的可用内存。

4

2 回答 2

5

不,PBS 不会自动为您在节点之间分配作业。但这是一件很常见的事情,你有几个选择。

  • 最简单且在某些方面对您最有利的方法是将任务捆绑成 1 节点大小的块,并将这些捆绑包作为单独的作业提交。这将使您的工作更快地开始;一个 1 节点的作业通常会比(比如说)14 个节点的作业安排得更快,只是因为调度中的单节点大小的空洞比 14 多。如果所有作业花费大致相同的时间,这会特别有效,因为那样做除法很简单。

  • 如果您确实想在一项工作中完成所有操作(例如,为了简化簿记),您可能有权也可能无法访问 pbsdsh 命令;这里有一个很好的讨论。这使您可以在作业中的所有处理器上运行单个脚本。然后编写一个脚本,查询 $PBS_VNODENUM 以找出它是哪个 nnodes*ppn 作业,并运行相应的任务。

  • 如果不是 pbsdsh,Gnu 并行是另一个可以极大简化这些任务的工具。它就像 xargs,如果你熟悉的话,但是会并行运行命令,包括在多个节点上。因此,您将提交(比如说)14 节点作业并让第一个节点运行 gnu 并行脚本。好消息是,即使作业的长度不同,这也会为您安排时间。我们向系统上的用户提供使用 gnu 并行处理这类事情的建议在这里。请注意,如果您的系统上没有安装 gnu parallel,并且由于某种原因您的系统管理员不会这样做,您可以在您的主目录中设置它,这不是一个复杂的构建。

于 2011-03-28T00:43:01.843 回答
2

您应该考虑作业数组

简而言之,你#PBS -t 0-109在你的 shell 脚本中插入(范围0-109可以是你想要的任何整数范围,但你说你有 110 个数据集)并且扭矩将:

  • 运行 110 个脚本实例,为每个实例分配您指定的资源(在带有#PBS标签的脚本中或在您提交时作为参数)。
  • PBS_ARRAYID为每个作业的环境变量分配一个 0 到 109 之间的唯一整数。

假设您可以访问代码中的环境变量,您只需告诉每个作业在数据集编号上运行PBS_ARRAYID

于 2012-04-07T19:53:08.850 回答