MPI进程如何在同一个节点中通信
How do MPI processes communicate in the same node
假设我们有一个节点有12个核心。有什么区别:
- 运行 一个 MPI 进程为每个内核管理 12 个线程。
- 每个核心只有 运行 12 个 MPI 进程。
前者通过共享内存通信,后者通过IPC通信。那么,哪个更快呢?差异可以忽略不计还是显着?
嗯,这取决于...
大多数 MPI 实现使用共享内存(而不是互连甚至 IPC)进行节点内通信。
一般来说,MPI+X用于混合编程:
- 用于节点间通信的 MPI
- 同一节点内的X
OpenMP 通常用作 X。也可以使用 MPI RMA(例如单侧通信),甚至还有更多选项可用。
从性能的角度来看,这又要视情况而定。
一些应用程序 运行 在平面 MPI 中更快(例如每个内核一个 MPI 进程),
而其他一些应用程序 运行 在混合 MPI+OpenMP 中速度更快。 (请记住,OpenMP 是为共享内存系统设计的,可以对内存进行平面访问,因此通常每个 NUMA 域(例如,大多数时候是套接字)有一个 MPI 任务,而每个节点有一个 MPI 任务。
最后但同样重要的是,MPI+OpenMP 内存开销和连线时间通常低于平面 MPI,这可能是一个重要因素。
假设我们有一个节点有12个核心。有什么区别:
- 运行 一个 MPI 进程为每个内核管理 12 个线程。
- 每个核心只有 运行 12 个 MPI 进程。
前者通过共享内存通信,后者通过IPC通信。那么,哪个更快呢?差异可以忽略不计还是显着?
嗯,这取决于...
大多数 MPI 实现使用共享内存(而不是互连甚至 IPC)进行节点内通信。
一般来说,MPI+X用于混合编程:
- 用于节点间通信的 MPI
- 同一节点内的X
OpenMP 通常用作 X。也可以使用 MPI RMA(例如单侧通信),甚至还有更多选项可用。
从性能的角度来看,这又要视情况而定。 一些应用程序 运行 在平面 MPI 中更快(例如每个内核一个 MPI 进程), 而其他一些应用程序 运行 在混合 MPI+OpenMP 中速度更快。 (请记住,OpenMP 是为共享内存系统设计的,可以对内存进行平面访问,因此通常每个 NUMA 域(例如,大多数时候是套接字)有一个 MPI 任务,而每个节点有一个 MPI 任务。
最后但同样重要的是,MPI+OpenMP 内存开销和连线时间通常低于平面 MPI,这可能是一个重要因素。