【问题标题】:I have 12 CPUs, 1 socket, 6 cores per socket, 2 threads per core - how does this information correspond to parallelization with MPI and OpenMP?我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 OpenMP 的并行化?
【发布时间】: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


【解决方案1】:

MPI 用于多台计算机的集群(共享内存节点)。通常,您为每个共享内存节点和共享内存节点中的 OpenMP 运行一个 MPI 等级(进程)。如果您以单台办公计算机为目标,则 MPI 不是编程模型的首选。最有可能的是,您应该专门使用 OpenMP。

现在每个节点运行多个 MPI 进程有一些正当理由,即出于 NUMA 的原因,或者因为您没有从共享内存中受益。

一般来说,如果您是初学者,请先关注一个并行范例并熟悉它。

【讨论】:

  • 单插槽 CPU 不足以 NUMA 用于 MPI,因为提到的 Zulan 等考虑会生效。
  • @tim18 我不想混淆坚持使用 OpenMP 的一般建议,但要强调总有例外。例如,对于裸片上的集群/子 NUMA 集群,即使使用单个套接字,也可以主张混合并行。
【解决方案2】:

“MPI 和 OpenMP 如何与此列表中的项目相对应” - 我会说对于 MPI,此列表无关紧要,而 OpenMP 最多可以进行 12 倍并行化。但问题是 OpenMP 并不能通过并行运行来神奇地提高您的代码速度。现有应用程序可能需要彻底检修才能利用多线程。因此,正确的起点是找出性能瓶颈中的哪一个是最容易并行化的,然后一一重做。 OpenMP 可能有帮助,也可能没有帮助。

【讨论】:

  • 有一些工具(例如免费的 Intel Advisor software.intel.com/en-us/advisor...)可以帮助您并行化代码。如果你打算按照 VTT 的建议去做,它可能会有很大帮助。 (FWIW 我为英特尔工作......)
  • 我从英特尔退休了。英特尔性能工具(Advisor 等人)仍然要求您观察上述回复中提到的一些问题,例如为您描述的 CPU 设置 OMP_PLACES=cores OMP_NUM_THREADS=6。如果没有线程固定,Advisor 不太可能产生一致的结果。大多数 MPI 都有内置功能,但最好先控制 OpenMP。
  • 顺便说一下,虽然 Advisor 在 linux 上同时使用 gcc(不是所有功能)和 icc,但您需要 Intel 编译器 ICL 才能在 Windows 上使用它。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2018-10-27
  • 2017-03-17
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
相关资源
最近更新 更多