Concurrency 运行串行作业的HPC群集

Concurrency 运行串行作业的HPC群集,concurrency,cluster-computing,Concurrency,Cluster Computing,我有一个在集群的单个核心上运行的脚本。每个串行作业都是独立的。每次您qsub时,我用来运行的集群都会分配一个核心,因此它假定ppn=1,然后其他所有人都可以使用其他核心。我只是通过循环qsub来提交我想要运行的串行作业的数量 然而,我们使用的另一个集群会自动为每个用户分配一个节点(他们已经将其设置为一个节点是最小的单元,而不是核心)。每个节点有16个核心。如果我提交脚本,它将被分配所有16个内核,但它只运行一个作业。因此,我想知道如何运行脚本并使它使用所有16个内核 我想到的一个想法是使用另一个

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

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

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

对于{1..16}中的i 做 ./[我的剧本]& 完成 等等

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


提前谢谢

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

您建议的脚本看起来不错,应该使用所有16个内核,当然,如果您的作业是可变运行时的(即16个作业中的15个可能在5分钟内完成,但1个运行小时),那么您仍然会有大量未使用的周期。如果这可能会影响到您,那么您需要更加复杂,在完成更大的工作集之前,有一些循环和生成过程。或者你可以从一个脚本中启动你想要的所有进程(因此你可能有60个或任何批在16个处理器上同时运行),让操作系统安排它们,这会降低速度,也许不会很多,你上面的数字从16对1的核心只有40%的放缓表明,这仍然会让你60%以上的利用率高达256个工作岗位


无论您做什么,都要确保您使用群集监控软件来确保真正的、已实现的cpu利用率如您所期望的那样。

oops,很抱歉,关于40%的减速,这与在旧群集上使用ppn=16发送脚本有关,因此它为作业分配了16个内核,而不仅仅是一个内核,然后我生成了16个进程,因此,在新集群上应该是这样的。我只是想测试这两种方法的速度,但由于我的旧方法在新集群上不起作用,所以我在旧集群上使用了这两种方法。希望这是有道理的。你是对的,作业需要可变的时间,我需要考虑一下如何优化它。好的,你是在测量cores*runtime作为度量标准吗?如果是这样,40%可能只是由于上述时间差异,即16核版本为16*最长运行vs(总和(运行时间)=16*平均运行时间)。