有关关于SLURM的HPC的问题

时间:2016-03-03 18:26:06

标签: hpc slurm

我有一些关于HPC的问题。我有一个串行和并行部分的代码。并行部分在不同的内存块上工作,并且在某些时候它们彼此通信。为此我在集群上使用了MPI。 SLURM是资源管理器。以下是群集中节点的规范。

节点规格:

Processor: 2x Intel Xeon E5-2690 (totally 16 cores 32 thread)
Memory : 256 GB 1600MHz ECC
Disk  : 2 x 600 GB 2.5" SAS (configured with raid 1)

问题:

1)节点上的所有内核是否共享相同的内存(RAM)?如果是,那么所有核心都以相同的速度访问内存吗?

2)考虑一个案例:

--nodes = 1
--ntasks-per-node = 1
--cpus-per-task = 16 (all cores on a node)

如果所有内核共享相同的内存(取决于对问题1的回答),是否会使用所有内核或者其中15个内核处于休眠状态,因为未使用OpenMP(用于共享内存)?

3)如果所需的内存占节点的总内存较少,那么使用单个节点要好得多,使用OpenMP实现核心级并行,并避免因节点之间的通信而造成时间损失?也就是说,使用这个

--nodes = 1
--ntasks-per-core = 1

而不是:

--nodes = 16
--ntasks-per-node = 1

其他问题与this链接中的陈述有关。

  

如果您的应用程序受CPU限制,请使用核心分配;您可以投入的处理器越多越好!

当核心不经常访问RAM时,这句话是否意味着--ntasks-per-core是好的?

  

如果内存访问是应用程序性能的瓶颈,请使用套接字分配。由于可以从内存中获取多少数据限制了作业的速度,因此在同一内存总线上运行更多任务不会导致加速,因为所有这些任务都在争夺内存的路径上。

我只是不明白这一点。我所知道的是套接字上的所有套接字和内核共享相同的内存。这就是为什么我不明白为什么--ntasks-per-socket选项可用?

  

如果某个节点范围的资源是您的应用程序的瓶颈,请使用节点分配。对于严重依赖磁盘访问或网络资源的应用程序而言就是这种情况。每个节点运行多个任务不会导致加速,因为所有这些任务都在等待访问同一个磁盘或网络管道。

这是否意味着,如果所需的内存超过单个节点的总RAM,那么使用多个节点会更好吗?

1 个答案:

答案 0 :(得分:1)

按顺序:

  1. 是的,所有内核共享相同的内存。但通常不会以相同的速度。通常,每个处理器(在您的配置中,您有2个处理器或插槽)具有“更接近”它的内存。通常Linux内核会尝试在附近的内存上分配内存。这不是用户应用程序通常需要担心的事情。
  2. 如果是串行作业,那么是的,15个内核将处于空闲状态。如果您的作业使用MPI,则它可以使用同一节点上的其他核心。实际上,同一节点上的MPI通常比跨多个节点的MPI快得多。
  3. 您可以在单个节点上使用OpenMP或MPI。我不确定速度差异,但如果你已经熟悉MPI,我会坚持这一点。差异可能不是那么大。但是,在单个节点上运行MPI与多个节点之间的差异将会很大。在单个节点上运行MPI将明显快于跨多个节点。
  4.   

    如果您的应用程序受CPU限制,请使用核心分配;您可以投入的处理器越多越好!

    这可能针对OpenMP或单节点并行作业。

      

    如果内存访问是应用程序性能的瓶颈,请使用套接字分配。由于可以从内存中获取多少数据限制了作业的速度,因此在同一内存总线上运行更多任务不会导致加速,因为所有这些任务都在争夺内存的路径上。

    请参阅答案1.尽管内存相同,但内核通常具有独立的内存总线。

      

    如果某个节点范围的资源是您的应用程序的瓶颈,请使用节点分配。对于严重依赖磁盘访问或网络资源的应用程序而言就是这种情况。每个节点运行多个任务不会导致加速,因为所有这些任务都在等待访问同一个磁盘或网络管道。

    如果您需要比单个节点更多的RAM,那么您别无选择,只能划分程序并使用MPI。