【问题标题】:Curious about how to specify the number of core for MPI in order to get the fastest scientific computation好奇如何指定 MPI 的核心数量以获得最快的科学计算
【发布时间】:2017-06-08 09:04:26
【问题描述】:

我一直在使用以下命令运行几个与 MPI 结合的科学程序包

nohup mpirun -np N -x OMP_NUM_THREADS=M program.exe < input > output &

其中 N 和 M 的值取决于我机器的物理 CPU 内核。比如我的机器有这样的规格

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24
On-line CPU(s) list:   0-23
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45
Model name:            Intel(R) Xeon(R) CPU E5-2440 0 @ 2.40GHz
Stepping:              7

在这种情况下,我首先尝试设置为 N = 24 和 M = 1,因此计算运行非常缓慢。然后我将 N 和 M 分别更改为 12 和 2。所以我发现后者显然为我提供了最快的计算。

我想知道为什么我将 N & M 设置为 12 和 2 提供比第一种情况更高的性能?

【问题讨论】:

  • 试试 N=2 和 M=12,我认为它给出了最快的代码。为什么?因为 OpenMP 是为共享内存设计的,而 MPI 是为分布式内存设计的。

标签: linux parallel-processing mpi openmp


【解决方案1】:

关于如何运行 MPI+OpenMP 应用程序没有绝对的规则。 唯一的建议是不要在多个套接字上运行 OpenMP 进程 (OpenMP 是为具有平面内存访问的 SMP 机器设计的,但如今,大多数系统都是 NUMA)

那就做实验吧。

一些应用在平面 MPI 中运行最好(例如,每个任务一个线程),而另一些应用在每个插槽一个 MPI 任务以及所有 OpenMP 可用内核的情况下运行最好。

最后但同样重要的是,如果您为每个 MPI 任务运行多个 OpenMP 线程,请确保您的 MPI 库按预期绑定 MPI 任务。 例如,如果您使用 12 个 OpenMP 线程运行,但 MPI 将任务绑定到一个内核,那么您最终会进行时间共享,并且性能会很糟糕。 或者如果您使用 12 个 OpenMP 线程运行,并且 MPI 任务绑定到 12 个内核,请确保 12 个内核在同一个插槽上(而不是每个插槽上 6 个)

【讨论】:

  • 大多数 openmp 应用程序在 Xeon 上运行良好,每个内核 1 个线程。一个可能的可能性是每个插槽 1 mpi 等级。如上所述,您需要设置亲和性,以便每个 mpi 进程对其核心组具有独占访问权限,每个线程保持在 1 个 cpu 上,并且线程在核心之间均匀分布。
  • 相关设置包括 omp_places=cores,以及相应的 num_threads,因为您似乎在当前 openmp 支持的 Linux 上运行。
  • 在 KNL 上,一些应用程序运行最佳平面 mpi,每个核心 2 个任务(例如,每个任务 2 个超线程)。如上所述,通过 OpenMP 运行时和从 MPI 继承的内容绑定 OpenMP 线程时,可以获得最佳性能。
  • 谢谢。 @GillesGouaillardet
【解决方案2】:

对此没有一般规则,因为在大多数情况下,此性能取决于应用程序本身的计算属性。

具有粗同步粒度的应用程序可以使用纯 MPI 代码(无多线程)很好地扩展。

如果同步粒度很好,那么使用共享内存多线程(例如 OpenMP)并将所有线程放在一个进程中彼此靠近(在同一个套接字中)变得更加重要:同步更便宜,内存访问延迟更小关键。

最后,计算密集型应用程序(性能受处理器限制)可能根本无法从超线程中受益,因为共享一个内核的两个线程会竞争它包含的功能单元。在这种情况下,您可能会发现使用 N=2 和 M=6 比使用 N=2 和 M=12 性能更好的应用程序。

【讨论】:

    【解决方案3】:

    确实没有关于如何运行 MPI+OpenMP 应用程序的绝对规则。 我同意吉尔斯所说的一切。 所以我想谈谈你的CPU。

    在您给出的规范中,它表明系统启用了超线程。 但这并不总是有帮助。您的计算机实际上有 12 个物理内核。 所以我建议你尝试一些使 M * N = 12 到 24 的组合, 如 12*1、6*2、6*3 哪一个是最好的,取决于你的应用程序有多好。

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2012-11-12
      • 2010-12-06
      • 2021-03-30
      相关资源
      最近更新 更多