【发布时间】:2019-08-30 16:05:50
【问题描述】:
我需要为一些计算要求高的 c++ 代码实现一些并行计算功能。我读过 MPI 和 OpenMP 的组合可以用来实现我所需要的 - MPI 可用于在处理器之间分配任务,而 OpenMP 用于在各个处理器上的线程之间分配任务。
我输入了lscpu(见下文)来检查我办公室电脑的处理器详细信息,但我不知道如何解释它。关键点似乎如下:
- 12 个 CPU
- 1 个插座
- 每个插槽 6 个内核
- 每个核心 2 个线程
那么我该如何解释并行化的可能性呢?具体来说,MPI 和 OpenMP 是如何对应这个列表中的项目的? MPI 是否用于在 12 个 CPU 之间分配,然后是 OpenMP 在 2 个线程之间分配?但是内核和套接字呢?
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 158
Model name: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
Stepping: 10
CPU MHz: 4409.872
CPU max MHz: 4700,0000
CPU min MHz: 800,0000
BogoMIPS: 7392.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 12288K
NUMA node0 CPU(s): 0-11
【问题讨论】:
-
为什么要结合使用 open-MP 和 MPI?这不是最简单的事情,而且你的表现会比你只使用 openmp 慢。
-
6 个内核,每个内核 2 个线程?所以你打开了超线程?除非另有说明,否则 OpenMP 可能会使用多达 12 个线程进行并行循环等。您可以使用 MPI 将工作分配给不同的进程,而不是单个进程的线程。
-
大多数应用程序的最佳选择是每个套接字(例如 NUMA 域)1 个 MPI 任务和每个内核 1 个 OpenMP 线程,并且 同时 MPI 和 OpenMP 运行时绑定所有内容。超线程通常没有帮助(当它没有伤害时)。当然,每个应用程序都不同,您应该尝试多种组合以针对每个应用程序找到最佳组合。
-
@AlainMerigot 目前我只是在我的办公室电脑上工作,但最终这段代码必须在集群上运行并尽可能并行化。
标签: c++ parallel-processing mpi openmp hpc