我需要为一些对计算要求很高的 C++ 代码实现一些并行计算功能。我读到 MPI 和 OpenMP 的组合可用于实现我的需要 - MPI 可用于在处理器之间分配任务,而 OpenMP 用于在各个处理器上的线程之间分配任务。
我输入了 lscpu
(见下文)来检查我办公室 PC 的处理器详细信息,但我不确定如何解释它。关键点似乎如下:
- 12 个 CPU
- 1 个 socket
- 每个插槽 6 个核心
- 每个核心 2 个线程
那么我如何根据并行化的可能性来解释这一点?具体来说,MPI和OpenMP如何对应这个列表中的项目? MPI 是否用于分布在 12 个 CPU 上,然后 OpenMP 分布在 2 个线程上?但是内核和 socket 呢?
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 rank(进程)。如果您的目标是一台办公室计算机,MPI 不是编程模型的首选。最有可能的是,您应该专门使用 OpenMP。
现在有一些合理的理由让每个节点运行多个 MPI 进程,即出于 NUMA 的原因,或者因为您无法从共享内存中获益。
一般来说,如果您是初学者,首先关注一种并行范式并熟悉它。
关于c++ - 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 OpenMP 的并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591518/