MPI进程如何在同一个节点中通信

How do MPI processes communicate in the same node

假设我们有一个节点有12个核心。有什么区别:

  1. 运行 一个 MPI 进程为每个内核管理 12 个线程。
  2. 每个核心只有 运行 12 个 MPI 进程。

前者通过共享内存通信,后者通过IPC通信。那么,哪个更快呢?差异可以忽略不计还是显着?

嗯,这取决于...

大多数 MPI 实现使用共享内存(而不是互连甚至 IPC)进行节点内通信。

一般来说,MPI+X用于混合编程:

  • 用于节点间通信的 MPI
  • 同一节点内的X

OpenMP 通常用作 X。也可以使用 MPI RMA(例如单侧通信),甚至还有更多选项可用。

从性能的角度来看,这又要视情况而定。 一些应用程序 运行 在平面 MPI 中更快(例如每个内核一个 MPI 进程), 而其他一些应用程序 运行 在混合 MPI+OpenMP 中速度更快。 (请记住,OpenMP 是为共享内存系统设计的,可以对内存进行平面访问,因此通常每个 NUMA 域(例如,大多数时候是套接字)有一个 MPI 任务,而每个节点有一个 MPI 任务。

最后但同样重要的是,MPI+OpenMP 内存开销和连线时间通常低于平面 MPI,这可能是一个重要因素。