parallel-processing - 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。然而,这将浪费处理器和集群中允许的小时数。
解决方案
好的,答案很简单,但取决于您正在使用的机器。但我认为它应该每次都有效。
在第二个集群的情况下,我不需要指定 line --ntasks-per-node=512
。我只需要告诉机器我总共需要多少个任务--tasks=512
,机器会自动分配相应数量的节点来完成这些任务。
重要提示:如果您ntasks
不是每个节点的处理器的倍数,那么最后一个节点将不会被完全使用。例如,在我的情况下,我需要 512 个任务,这对应于 13 个节点 = 520 个处理器。前 12 个处理器已完全使用,但最后一个未使用,因此 8 个处理器为空。
请注意,这可能会在某些代码中导致一些优化问题,因为最后一个节点上的进程将需要与其他节点中的大多数进程进行通信。对我来说不是问题,但我知道另一个有问题的代码。
推荐阅读
- php - 从数据库卷曲 ping URL 并在网页上发布时间
- c# - 在 linux-arm 上使用 azure-iot-sdk-csharp -> SecurityProviderTpmHsm 时缺少 bcrypt.dll
- r - 如何下载沿海数据
- python - 使用python实现队列
- alibaba-cloud - 尝试使用 Internet 端点访问存储在阿里云 OSS 中的文件时,会抛出错误
- post - 如何在控制器中检索 POST 数据
- javascript - 重试请求,直到结果返回值
- java - Spring MVC 如何判断 homecontroller 和 jsp 之间的冲突?
- excel - 当我在工作表中使用此自定义函数 (MultiplyBigNumbers) 时出现错误。代码或语法有问题吗?
- android - 卡片视图中列表视图的高度在滚动后发生变化