想知道如何为MPI指定核心数量以获得最快的科学计算

时间:2017-06-08 09:04:26

标签: linux parallel-processing mpi openmp

我使用以下命令

与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&amp; M是12和2提供比第一种情况更高的性能吗?

3 个答案:

答案 0 :(得分:2)

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

然后进行实验。

某些应用程序在平面MPI中运行最佳(例如,每个任务一个线程),而其他一些应用程序最适合每个套接字一个MPI任务,以及OpenMP的所有可用内核。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

最后,计算绑定应用程序(性能受处理器限制)可能根本不会从超线程中受益,因为两个线程共享核心争用它所包含的功能单元。在这种情况下,您可以找到使用N = 2和M = 6比使用N = 2和M = 12更好的应用程序。