我有一些关于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,那么使用多个节点会更好吗?
答案 0 :(得分:1)
按顺序:
如果您的应用程序受CPU限制,请使用核心分配;您可以投入的处理器越多越好!
这可能针对OpenMP或单节点并行作业。
如果内存访问是应用程序性能的瓶颈,请使用套接字分配。由于可以从内存中获取多少数据限制了作业的速度,因此在同一内存总线上运行更多任务不会导致加速,因为所有这些任务都在争夺内存的路径上。
请参阅答案1.尽管内存相同,但内核通常具有独立的内存总线。
如果某个节点范围的资源是您的应用程序的瓶颈,请使用节点分配。对于严重依赖磁盘访问或网络资源的应用程序而言就是这种情况。每个节点运行多个任务不会导致加速,因为所有这些任务都在等待访问同一个磁盘或网络管道。
如果您需要比单个节点更多的RAM,那么您别无选择,只能划分程序并使用MPI。