请求" M"的整数倍SGE上每个节点的核心数

时间:2015-10-27 15:39:27

标签: multithreading mpi openmp hpc sungridengine

我想向SGE提交一个多线程MPI作业,而我运行的集群有不同的节点,每个节点都有不同的核心数。假设每个进程的线程数是M(对于OpenMP,M == OMP_NUM_THREADS)如何请求提交到SGE队列的作业以这样的方式运行,即在每个节点中运行,为我的工作分配M的整数倍?

假设M = 8,并且MPI任务的数量是5(因此总共请求40个核心)。在这个集群中,有4,8,12和16个核心的节点。然后这个组合就可以了:

2*(8-core nodes) + 1*(16-core nodes) + 0.5*(16-core nodes)

但当然不是这些中的任何一个:

2*(4-core nodes) + 2*(8-core nodes) + 1*(16-core node)
2*(12-core nodes) + 1*(16-core node)
(3/8)*(8-core nodes) + (5/8)*(8-core nodes) + 2*(16-core node)
PS:还有另一个类似的问题,比如这个问题:( MPI & pthreads: nodes with different numbers of cores),但是我的不同,因为每个MPI进程必须运行M个线程(想想混合MPI + OpenMP)。

最好的方案是在同一类节点上独占运行此作业。但是为了加快开始时间,我希望允许此作业在不同类型的节点上运行,前提是每个节点都有分配给作业的整数* M个核心。

1 个答案:

答案 0 :(得分:1)

SGE中的分配策略是基于并行环境(PE)指定的。可以将每个PE配置为以特定方式填充群集节点上可用的插槽。一个请求具有-pe pe_name num_slots参数的特定PE,然后SGE尝试在num_slots PE的分配策略之后找到pe_name个时隙。不幸的是,没有简单的方法来请求每个节点的整数倍数的插槽。

为了能够为每个主机(而不是M的倍数)请求完全 M个广告位,您的SGE管理员(或者您,如果您是SGE管理员)必须首先创建一个新的PE,让它调用它mpi8ppn,将其allocation_rule设置为8,然后将PE分配给每个集群队列。然后,您必须使用-pe mpi8ppn 40将作业提交到该PE,并指示MPI运行时仅为每个主机启动一个进程,例如使用-npernode 1进行Open MPI。

如果不太可能发生上述情况,那么您的另一个(不可靠)解决方案是每个插槽请求一个非常大的内存量,接近每个节点的内存,例如: -l h_vmem=23.5G。假设节点配置了{Gi 1}的h_vmem,此请求将确保SGE不能在每个主机上安装多个插槽。因此,如果您想在5个节点上启动混合作业,您只需向SGE询问5个插槽,并为每个插槽询问23.5G vmem

qsub -pe whatever 5 -l h_vmem=23.5G <other args> jobscript

#$ -pe whatever 5
#$ -l h_vmem=23.5G

此方法不可靠,因为它不允许您选择具有特定内核数的群集节点,并且仅在所有节点都配置为h_vmem小于47 GB的情况下才有效。 h_vmem在这里仅作为示例 - 任何其他每个插槽的耗材属性都应该这样做。以下命令可以让您了解定义了哪些主机复合体以及它们在群集节点中的值:

qhost -F | egrep '(^[^ ])|(hc:)'

此方法最适用于node_mem = k * #coresk在所有节点上保持不变的群集。如果一个节点提供两倍数量的内核,但也有两倍的内存,例如48 GiB,那么上面的请求会在这样的节点上给你两个插槽。

我没有声称完全理解SGE,我的知识可以追溯到SGE 6.2u5时代,因此现在可能存在更简单的解决方案。