我有一个在群集的单个核心上运行的脚本。每个串行作业都是独立的。我用来运行的集群在每次qsub时都会分配一个核心,因此它假设ppn = 1,然后其他所有人都可以使用其他核心。我只是通过循环qsub提交我想要运行的串行作业数。
然而,我们使用的另一个集群会自动为每个用户分配一个节点(他们已将其设置为使节点是最小的单元而不是核心)。每个节点有16个核心。如果我然后提交我的脚本,它将被分配所有16个核心,但它只运行一个作业。我很奇怪如何运行脚本并使其全部使用16个内核?
我想到的一个想法是使用另一个循环我当前脚本的脚本来运行并发作业:
{1..16}中的做 ./ [my script]& DONE 等待
然后我用节点= 1,ppn = 16对此进行qsub。然后,我认为会产生16个进程,但我不知道它是否实际上正在使用所有16个核心或一个核心试图运行所有16个进程。哪个是对的?这样做也比我原来的做法慢了大约40%(在旧集群上测试的两种方法)。有没有更好的方法呢?
提前致谢。
答案 0 :(得分:0)
如果你说“16份副本”的方法运行速度慢了40%,你就会谈论从旧集群中获取的时间,即在一个核心上运行16个拷贝。它没有直接暗示在16个核心上运行16个拷贝会更慢。
你建议的脚本看起来很好, 应该使用所有16个核心,当然如果你的工作是可变的运行时间(即16个中的15个可能在5分钟内完成但是1个小时运行)然后你仍然会有很多未使用的周期。如果这可能会产生影响,则需要更复杂,并且需要循环和生成进程,直到完成更大的工作集。或者您可以从1个脚本启动 ALL 所需的进程(因此您可能有60个或在16个处理器上同时运行的任何批处理)并让操作系统安排它们,这会减慢速度,也许不会很多,你的数字从16对1核心只有40%的减速建议这仍然会让你获得60%+利用率高达256个工作岗位。
无论您做什么,都要确保使用群集监控软件来确保实际的,实现的cpu利用率符合您的预期。