0

我有一个在集群的单个核心上运行的脚本。每个串行作业都是独立的。我用来运行的集群每次 qsub 时都会分配一个核心,因此它假定 ppn=1,然后其他人都可以使用其他核心。我只是通过循环 qsub 提交我想要运行的串行作业的数量。

然而,我们使用的另一个集群会自动为每个用户分配一个节点(他们已将其设置为节点是最小的单元而不是核心)。每个节点有 16 个核心。如果我然后提交我的脚本,它被分配了所有 16 个内核,但它只运行一项工作。因此,我想知道如何运行脚本并使其使用所有 16 个内核?

我想到的一个想法是使用另一个循环我当前脚本的脚本来运行并发作业,如下所示:

for i in {1..16} do ./[my script] & done wait

然后我用nodes=1,ppn=16 qsub 这个。然后我认为这会产生 16 个进程,但我不知道它实际上是在使用所有 16 个内核还是一个试图运行所有 16 个进程的内核。哪个是对的?这样做也比我的旧方法慢了大约 40%(两种方法都在旧集群上测试过)。有更好的方法吗?

提前致谢。

4

1 回答 1

0

当您说“16 个副本”方法运行速度慢 40% 时,您指的是从旧集群中获取的时间,即在一个核心上运行 16 个副本。它并不直接表明在 16 个内核上运行 16 个副本会更慢。

您建议的脚本看起来不错,应该使用所有 16 个内核,当然,如果您的作业具有可变运行时(即 16 个中的 15 个可能在 5 分钟内完成,但 1 个运行几个小时),那么您仍然会有大量未使用循环。如果这可能会产生影响,您将需要更复杂,并有一些循环和生成过程,直到完成更大的工作集。或者你可以从 1 个脚本启动你想要的所有进程(所以你可能有 60 个或任何批处理在 16 个处理器上同时运行)并让操作系统安排它们,这会减慢速度,也许不会很多,你上面的数字来自16 on 1 core 仅提供 40% 的减速,这表明这仍然可以让您获得 60% 以上的利用率,最多 256 个工作。

无论您做什么,请确保您使用集群监控软件来确保真实的、已实现的 cpu 利用率符合您的预期。

于 2013-08-23T00:14:49.560 回答