我需要为一些计算要求严格的c ++代码实现一些并行计算功能。我已经读过可以使用MPI和OpenMP的组合来实现我所需要的 - MPI可用于在处理器之间分配任务,而OpenMP用于在各个处理器上的线程之间分配任务。
我键入lscpu
(见下文)来检查我的办公室电脑的处理器细节,但我不知道如何解释它。关键点似乎如下:
那么我如何根据并行化的可能性来解释这一点呢?具体来说,MPI和OpenMP如何对应此列表中的项目? MPI是用来分配12个CPU,然后通过2个线程分配OpenMP吗?但那么核心和套接字呢?
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
MPI用于多台计算机(共享内存节点)的集群。通常,您为共享内存节点中的每个共享内存节点和OpenMP运行一个MPI排名(进程)。如果您瞄准单个办公室计算机,MPI不是编程模型的首选。最有可能的是,您应该独占使用OpenMP。
现在有一些有效的理由来为每个节点运行多个MPI进程,即出于NUMA的原因,或者因为您没有从共享内存中受益。
一般来说,如果您是初学者,首先关注一个并行范例并熟悉它。
“MPI和OpenMP如何与此列表中的项目相对应” - 我会说MPI这个列表无关紧要,而OpenMP最多只能进行12x并行化。但问题是OpenMP并没有通过并行运行来神奇地为你的代码提供速度提升。现有应用程序可能需要彻底检查才能利用多个线程。因此,正确的出发点是找出哪个性能瓶颈是最容易并行的并且逐个返工。 OpenMP可能有也可能没有任何帮助。