2017-06-08 365 views
0

我一直在使用下面的命令好奇如何指定核心数量为MPI,以获得最快的科学计算

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

运行一些科学的程序包连同MPI其中的价值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提供更多的性能比第一种情况下高?

+1

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

回答

2

关于如何运行MPI + OpenMP应用程序没有绝对规则。 唯一的忠告是:不要上运行一个以上的插座 的OpenMP的进程(OpenMP的是专为SMP机器与平面内存访问,但今天,大多数系统是NUMA)

然后就实验。

一些应用程序运行在最佳的MPI平(每个任务例如一个线程),而每个插槽一个MPI任务,并为OpenMP的所有可用内核的一些其他工作最好的。

最后但并非最不重要的,如果你每运行MPI任务不止一个OpenMP的线程,请确保您的MPI库绑定的MPI任务的预期。例如,如果使用12个OpenMP线程运行MPI,但MPI将任务绑定到一个核心,则最终会进行时间共享,并且性能会很糟糕。 或者如果您运行12个OpenMP线程,并且MPI任务绑定到12个内核,请确保12个内核位于同一个套接字上(而不是每个套接字上的6个)

+1

大多数openmp应用程序在Xeon上运行良好,每个内核有1个线程。一个可能的可能性是每插槽1 mpi的等级。如上所述,您需要亲和性设置,以便每个mpi进程对其核心组拥有独占访问权限,每个线程保持在1个CPU上,并且线程均匀分布在核心之间。 – tim18

+1

其中相关的设置是omp_places = cores,并带有相应的num_threads,因为您似乎在当前openmp支持的Linux上运行。 – tim18

+0

对于KNL,某些应用程序运行的平均mpi最高,每个核心有2个任务(例如,每个任务有2个超线程)。如上所述,通过OpenMP运行时绑定OpenMP线程和从MPI继承的内容可以实现最佳性能。 –

0

对于如何运行MPI + OpenMP应用程序。 我同意所有吉尔斯说。 所以我想谈谈你的情况下的CPU。

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

0

有关于这不一般的规则,因为,大部分的时间,这样的表现是依赖于应用本身的计算性能。

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

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

最后,计算结合的应用(性能由处理器限制)有可能不从超线程在所有获益,因为两个线程共享一个核心争它包含的功能单元。在这种情况下,您可能发现使用N = 2和M = 6的应用程序比使用N = 2和M = 12的应用程序性能更好。