CPU 数量与核心 CPU 总数不同的 sbatch 脚本?
sbatch script with number of CPUs different to total number of CPUS in cores?
我习惯于在集群中启动一个 sbatch 脚本,集群中的节点有 32 个 CPU,我的代码需要 2 个处理器的幂。
例如我这样做:
#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 个进程的模拟最少需要 10 个小时,所以用 32 个进程进行更大的模拟将需要一周的时间。而且我现在不仅需要一个模拟,而且至少需要 20 个。
另一种解决方案是要求 16 个节点 (32*16=512),并且每个节点仅使用 32 个 proc。然而,这将浪费处理器和允许我在集群中的小时数。
好的,答案很简单,但取决于您使用的机器。但我认为它应该每次都有效。
对于第二个集群,我不需要指定行 --ntasks-per-node=512
。我只需要告诉机器我总共需要多少任务--tasks=512
,机器会自动分配相应数量的节点来完成这些任务。
重要提示:如果您的 ntasks
不是每个节点处理器的倍数,那么最后一个节点将不会被完全使用。例如,在我的例子中,我需要 512 个任务,这对应于 13 个节点 = 520 个处理器。前 12 个处理器已完全使用,但最后一个未被完全使用,并留下 8 个处理器为空。
请注意,这可能会在某些代码中引起一些优化问题,因为最后一个节点上的进程将需要与其他节点中的大多数进程进行通信。对我来说这不是问题,但我知道这是一个问题的另一个代码。
我习惯于在集群中启动一个 sbatch 脚本,集群中的节点有 32 个 CPU,我的代码需要 2 个处理器的幂。
例如我这样做:
#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 个进程的模拟最少需要 10 个小时,所以用 32 个进程进行更大的模拟将需要一周的时间。而且我现在不仅需要一个模拟,而且至少需要 20 个。
另一种解决方案是要求 16 个节点 (32*16=512),并且每个节点仅使用 32 个 proc。然而,这将浪费处理器和允许我在集群中的小时数。
好的,答案很简单,但取决于您使用的机器。但我认为它应该每次都有效。
对于第二个集群,我不需要指定行 --ntasks-per-node=512
。我只需要告诉机器我总共需要多少任务--tasks=512
,机器会自动分配相应数量的节点来完成这些任务。
重要提示:如果您的 ntasks
不是每个节点处理器的倍数,那么最后一个节点将不会被完全使用。例如,在我的例子中,我需要 512 个任务,这对应于 13 个节点 = 520 个处理器。前 12 个处理器已完全使用,但最后一个未被完全使用,并留下 8 个处理器为空。
请注意,这可能会在某些代码中引起一些优化问题,因为最后一个节点上的进程将需要与其他节点中的大多数进程进行通信。对我来说这不是问题,但我知道这是一个问题的另一个代码。