./program1 & ./program2 & ./program3 & ./program4
这将自然地在不同的处理器上运行每个串行程序.这在登录服务器或独立工作站上运行良好,当然也适用于只需要一个节点的批处理作业.
但是,如果我需要运行同一程序的110个不同实例来读取110个不同的数据集呢?如果我使用提交110 ./program#命令的脚本提交到多个节点(比如14),批处理系统是否会在不同节点上的不同处理器上运行每个作业,或者它是否会尝试在同一个节点上运行它们, 8个核心节点?
我曾尝试使用简单的MPI代码来读取不同的数据,但会产生各种错误,110个流程中有大约100个成功,其他流程崩溃.我也考虑了作业数组,但我不确定我的系统是否支持它.
我已经在各个数据集上广泛测试了串行程序 – 没有运行时错误,并且我没有超过每个节点上的可用内存.
不,PBS不会为您自动在节点之间分配作业.但这是一个常见的事情,你有几个选择.>最简单且在某些方面最有利于您的任务是将任务分成1节点大小的块,并将这些捆绑包作为单独的作业提交.这将使您的工作更快地开始;单节点作业通常会比(比方说)14节点作业更快地进行调度,因为调度表中的单节点大小比14更多.如果所有作业花费大致相同的时间,则效果特别好因为那时做分工非常简单.
>如果您确实希望在一个作业中完成所有操作(例如,为了简化簿记),您可能有也可能无法访问pbsdsh命令;有一个很好的讨论它here.这使你可以在你的工作中的所有处理器上运行一个脚本.然后编写一个查询$PBS_VNODENUM的脚本,找出它所在的nnodes * ppn作业,然后运行相应的任务.
>如果不是pbsdsh,Gnu parallel是另一个可以极大地简化这些任务的工具.它就像xargs,如果你熟悉它,但会并行运行命令,包括多个节点.所以你提交你的(比方说)14节点作业并让第一个节点运行gnu并行脚本.好处是,即使作业长度不同,这也会为您安排.我们为系统上的用户提供的使用gnu parallel用于这些事情的建议是here.请注意,如果您的系统上没有安装gnu parallel,并且由于某种原因您的系统管理员不会这样做,您可以设置它在您的主目录中,它不是一个复杂的构建.