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

Requesting integer multiple of "M" cores per node on SGE

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

假设 M=8,MPI 任务数为 5(因此总共请求了 40 个内核)。在这个集群中,有 4 个、8 个、12 个和 16 个核心的节点。那么这个组合就OK了:

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 个内核。

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

为了能够为每个主机请求正好 M 个插槽(而不是 M 的倍数),您的 SGE 管理员(或您, 如果你是 SGE 管理员) 必须首先创建一个新的 PE,我们称之为 mpi8ppn,将其 allocation_rule 设置为 8,然后将 PE 分配给每个集群队列。然后,您必须使用 -pe mpi8ppn 40 将作业提交给该 PE,并指示 MPI 运行时在每个主机上仅启动一个进程,例如-npernode 1 用于 Open MPI。

如果上述情况不太可能发生,您的另一个(不可靠的)解决方案是为每个插槽请求非常多的内存,接近每个节点所拥有的内存,例如-l h_vmem=23.5G。假设节点配置为 h_vmem 24 GiB,此请求将确保 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

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

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

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

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