首页 > 解决方案 > sbatch 脚本的 CPU 数量与内核中 CPU 的总数不同?

问题描述

我习惯于在节点有 32 个 CPU 并且我的代码需要 2 个处理器的能力的集群中启动一个 sbatch 脚本。

例如我这样做:

#SBATCH -N 1
#SBATCH -n 16
#SBATCH --ntasks-per-node=16

或者

#SBATCH -N 2
#SBATCH -n 64
#SBATCH --ntasks-per-node=32

但是我现在需要使用一个不同的集群,每个节点都有 40 个 CPU。目前我只使用一个节点和 32 个进程进行测试:

#SBATCH --ntasks=32
#SBATCH --ntasks-per-node=32

(我后来从集群的文档中得到了这个脚本。他们在这个例子中没有使用这#SBATCH -N条线,我不知道为什么但可能是因为它是一个例子)

但是,我现在需要使用 512 个处理器进行更大的模拟。我需要使用的更接近的节点数是 13(即 40*13=520 个处理器)。现在的问题是每个节点的任务数(技术上)不是整数。

我认为一个解决方案是要求 13 个节点,我将完全使用 12 个节点,只有我不会完全使用最后一个节点。

我的问题是我该怎么做?,有没有另一种方法可以在不更改代码的情况下做到这一点?(不可能更改代码,是一个巨大的代码)。

一个 512 proc 的模拟最少需要 10 个小时,所以用 32 个 proc 做一个更大的模拟需要一周时间。而且我不仅需要一个模拟,而且目前至少需要 20 个。

另一种解决方案是要求 16 个节点(32*16=512)并且每个节点只使用 32 个 proc。然而,这将浪费处理器和集群中允许的小时数。

标签: parallel-processingmpislurmsbatch

解决方案


好的,答案很简单,但取决于您正在使用的机器。但我认为它应该每次都有效。

在第二个集群的情况下,我不需要指定 line --ntasks-per-node=512。我只需要告诉机器我总共需要多少个任务--tasks=512,机器会自动分配相应数量的节点来完成这些任务。

重要提示:如果您ntasks不是每个节点的处理器的倍数,那么最后一个节点将不会被完全使用。例如,在我的情况下,我需要 512 个任务,这对应于 13 个节点 = 520 个处理器。前 12 个处理器已完全使用,但最后一个未使用,因此 8 个处理器为空。

请注意,这可能会在某些代码中导致一些优化问题,因为最后一个节点上的进程将需要与其他节点中的大多数进程进行通信。对我来说不是问题,但我知道另一个有问题的代码。


推荐阅读