0

我一直在使用集群来做一些繁重的计算。有几件事我不明白。例如,到目前为止,我在所有工作中都使用了这个配置

#SBATCH -J ss      
#SBATCH -N 1         # allocate 1 nodes for the job
#SBATCH -n 15        # 20 tasks total
#SBATCH -t 12:0:0    
#SBATCH --mem=12000 

但是,我不知道节点是否是计算机(-N 1)以及什么是任务(-n 15)。

我的代码是 MPI,但理想情况下我想做一个混合 MPI 和 OpenMP。我应该如何配置我的 SBATCH 来做到这一点?

谢谢你。

4

2 回答 2

1

集群是一组节点,每个节点是一台独立的计算机(一堆 CPU 和一些 GPU 或其他加速器),然后节点通过网络连接(值得注意的是,内存地址在超级计算机中通常是全局的)。然后你有两种类型的超级计算机:共享内存和分布式内存。

超级计算机体系结构值得一读……维基百科是一个很好的起点!

进程是一个独立的工作单元。进程不共享内存,它们需要一种方式来访问彼此的内存,为此您使用诸如 MPI 之类的库。

在 slurm 中,一个进程被称为一个任务......

要设置任务数(实际上是进程),请使用 -ntasks 或简单地 -n 然后您可以设置每个节点的任务数或节点数。这是2个不同的东西!

--ntasks-per-node 为您提供每个节点的任务数 --nodes 为您提供所需的最小节点数。如果您指定 --nodes=2 这意味着您将拥有至少 2 个节点,但可能会更多...如果您的节点有 18 个核心,并且您要求 40 个任务,那么您至少需要 3 个节点...这就是为什么应该避免使用 --nodes (除非你知道你在做什么!)

然后可以将给定数量的 CPU(处理器的核心)分配给单个任务。这是使用 --cpu-per-task 设置的。

一个 MPI 等级是一项任务。然后一个任务可以启动多个线程。如果您将 --cpu-per-task 设置为 1,则所有这些线程将在同一个核心上运行。并因此争夺资源。通常,您希望每个内核有一个线程(如果使用超线程,则为 2 个)。

当您设置 --cpu-per-task 时,每个节点的核心数必须更少,因为任务只能在单个节点上运行!(在分布式内存系统上)。

总结一下:

因此,如果您想运行 M 个 mpi 进程,每个进程将午餐 N 个线程。第一个 N 必须小于每个节点的核心数,最好是每个节点的核心数的整数除数(否则你会浪费一些核心)。

您将设置:--ntasks="M" --cpus-per-task="N"

然后您将使用以下命令运行: srun ./your_hybrid_app

然后不要忘记 2 件事: 如果您使用 OpenMP: 设置线程数:

导出 OMP_NUM_THREADS="N"

并且不要忘记为多线程正确初始化 MPI ......

!/bin/bash -l
#
#SBATCH --account=myAccount
#SBATCH --job-name="a job"
#SBATCH --time=24:00:00
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=4
#SBATCH --output=%j.o
#SBATCH --error=%j.e

export OMP_NUM_THREADS=4
srun ./your_hybrid_app

这将启动 16 个任务,每个任务有 4 个核心(每个任务有 4 个 OMP 线程,所以每个核心一个)。

于 2019-02-23T18:56:03.033 回答
-2

节点是一台计算机,任务是加载到内存中的每个二进制文件(在 MPI 中,相同的二进制文件有好几次)。如果这些二进制文件还执行 OpenMP 或线程(同一节点中的任何类型的多处理),您还必须告知每个任务将使用多少 CPU。

于 2019-02-23T09:19:37.330 回答