sbatch
手册中使用的术语可能有点令人困惑。因此,我想确保我正确设置了选项。假设我有一个任务需要在单个节点上运行,并且需要 N 个线程。 我是否正确地假设我将使用 --nodes=1
和 --ntasks=N
?
我习惯于考虑在单个进程中使用 pthreads 创建 N 个线程。那他们所称的“核心”或“每个任务的 CPU 数”是否就是这种结果?在我看来,CPU 和线程不是同一回事。
sbatch
手册中使用的术语可能有点令人困惑。因此,我想确保我正确设置了选项。假设我有一个任务需要在单个节点上运行,并且需要 N 个线程。 我是否正确地假设我将使用 --nodes=1
和 --ntasks=N
?
我习惯于考虑在单个进程中使用 pthreads 创建 N 个线程。那他们所称的“核心”或“每个任务的 CPU 数”是否就是这种结果?在我看来,CPU 和线程不是同一回事。
--ntasks=#
: “任务”数量(与分布式并行性一起使用)。
--ntasks-per-node=#
:每个节点的“任务”数(与分布式并行性一起使用)。
--cpus-per-task=#
:分配给每个任务的CPU数量(与共享内存并行性一起使用)。
从这个问题看:如果每个节点有24个核心,这些命令之间有什么区别吗?
sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]
答案: (由Matthew Mjelde提供)
是的,这两种提交方式有区别。你正确指出通常
ntasks
是用于mpi
,而cpus-per-task
则是用于多线程,但让我们看看你的命令:对于你的第一个例子,
sbatch --ntasks 24 […]
将分配一个有24个任务的工作。在这种情况下,这些任务仅使用1个CPU,但可能跨多个节点分割。因此,您将在多个节点上获得总共24个CPU。对于你的第二个例子,
sbatch --ntasks 1 --cpus-per-task 24 [...]
将分配一个只有1个任务但该任务占用24个CPU的作业。因此,您将在单个节点上获得总共24个CPU。换句话说,一个任务不能被分割到多个节点上。因此,使用
--cpus-per-task
将确保该任务被分配到同一节点,而使用--ntasks
可以并且可能将其分配到多个节点上。
CÉCI支持网站上的另一个好问题和答案:假设您需要16个核心。以下是一些用例:
- 您使用mpi,不关心这些核心分布在哪里:
--ntasks=16
- 您想启动16个独立进程(无通信):
--ntasks=16
- 您希望这些核心分布在不同的节点上:
--ntasks=16 and --ntasks-per-node=1
或--ntasks=16 and --nodes=16
- 您希望这些核心分布在不同的节点上,并且不受其他作业的干扰:
--ntasks=16 --nodes=16 --exclusive
- 您希望16个进程分布在8个节点上,每个节点有两个进程:
--ntasks=16 --ntasks-per-node=2
- 您希望16个进程保留在同一节点上:
--ntasks=16 --ntasks-per-node=16
- 您希望一个进程可以使用16个核心进行多线程处理:
--ntasks=1 --cpus-per-task=16
- 您希望4个进程可以每个进程使用4个核心进行多线程处理:
--ntasks=4 --cpus-per-task=4
sbatch --ntasks 24 [...]
中,如果我选择了 --nodes=1
呢?这种情况下是否与您的第二个例子 sbatch --ntasks 1 --cpus-per-task 24 […]
相同,从而在单个节点上获得总共24个CPU? - Tanash--nodes=1 --ntasks=1 --cpus-per-task=N
,其中 N 是(OpenMP)并行线程的数量。请参见此处的示例 https://stackoverflow.com/a/50654725/786542 - Tungsbatch --ntasks 1
表示 sbatch 脚本中线程的数量吗? - Tanash--cpus-per-task=N
是不可以的。 - Tung#SBATCH --nodes=N
(N
越高越好) 对这个解释有任何影响吗? - undefined
OMP_NUM_THREADS
设置为大于机器核心数的数字,它们只会被“超载”,但任何其他的澄清都会非常欣赏! - andreagalle