sbatch
手册页中使用的术语可能有些混乱。因此,我想确保我设置的选项正确。假设我有一个任务要在具有N个线程的单个节点上运行。我是否正确地假设我会使用--nodes=1
和--ntasks=N
?
我习惯于考虑使用例如pthread在单个进程中创建N个线程。是它们所谓的“核心”或“每个任务的CPU使用率”的结果吗?在我看来,CPU和线程不是一回事。
答案 0 :(得分:11)
Depending on the parallelism you are using: distributed or shared memory
--ntasks=#
:“任务”的数量(与分布式并行性一起使用)。
--ntasks-per-node=#
:每个节点的“任务”数(与分布式并行性一起使用)。
--cpus-per-task=#
:分配给每个任务的CPU数量(与共享内存并行性一起使用)。
From this question:如果每个节点都有24个核心,这些命令之间有什么区别吗?
sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]
答案:
是的,这两个提交之间存在差异。您是正确的,通常 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
可以并且可以将其分配给多个节点。
Another good Q&A:假设您需要16个内核。这是一些用例
--ntasks=16
--ntasks=16
--ntasks=16 and --ntasks-per-node=1
或--ntasks=16 and --nodes=16
--ntasks=16 --nodes=16 --exclusive
--ntasks=16 --ntasks-per-node=2
--ntasks=16 --ntasks-per-node=16
--ntasks=1 --cpus-per-task=16
--ntasks=4 --cpus-per-task=4