我需要为一些对计算有要求的c ++代码实现一些并行计算功能。我已经读过MPI和OpenMP的组合可以用来实现我所需要的-MPI可以用于在处理器之间分配任务,而OpenMP可以用于在各个处理器上的线程之间分配任务。
我键入了lscpu
(请参阅下文)以检查我的办公室PC的处理器详细信息,但是我不确定如何解释它。关键点如下:
那么我该如何从并行化的可能性来解释这一点?具体来说,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
答案 0 :(得分:3)
MPI用于多台计算机的群集(共享内存节点)。通常,您为共享内存节点中的每个共享内存节点和OpenMP运行一个MPI等级(进程)。如果您针对一台办公计算机,则MPI并不是编程模型的首选。您很有可能应该专门使用OpenMP。
现在,出于某些原因,有充分的理由要在每个节点上运行一个以上的MPI进程,即出于NUMA的原因,或者因为您没有从共享内存中受益。
通常,如果您是初学者,请先专注于一种并行范例并熟悉它。
答案 1 :(得分:3)
“ MPI和OpenMP如何与该列表中的项目相对应” -我想说,对于MPI,此列表无关紧要,而OpenMP最多能够进行12倍并行化。但事实是,OpenMP不能通过并行运行来神奇地提高代码速度。现有应用程序可能需要彻底检修才能利用多个线程。因此,正确的出发点是弄清楚哪个性能瓶颈是最容易并行进行并逐个进行重新处理的一个。 OpenMP可能有帮助,也可能没有帮助。