我使用以下命令
与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提供比第一种情况更高的性能吗?
答案 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更好的应用程序。