共享内存系统性能的消息传递接口

Message passing interface on shared memory systems performance

本文关键字:消息传递接口 系统性能 内存 共享      更新时间:2023-10-16

据我所知,并行处理消息传递接口和多线程有两种方法。多线程不能用于没有消息传递接口的分布式内存系统;但是消息传递接口可用于系统"共享内存"和"分布式内存"。我的问题是关于与 MPI 并行化并在共享内存系统上运行的代码的性能。此代码的性能是否与使用多线程并行化的代码在同一范围内?

更新:

我的工作是进程需要反复相互通信,通信阵列可以是200 * 200

矩阵

答案是:视情况而定。MPI 进程主要是独立的操作系统进程,当通信进程在同一共享内存节点上运行时,它们之间的通信使用某种共享内存 IPC 技术进行。作为独立的操作系统进程,MPI 进程通常不共享数据,有时必须在每个进程中复制数据,这会导致内存使用率低于最佳状态。另一方面,线程可以共享大量数据,并且可以从缓存重用中受益,尤其是在具有大型共享最后一级缓存的多核 CPU 上(例如,当前一代 x86 CPU 上的 L3 缓存)。当缓存重用与线程之间数据交换的更轻量级方法(通常只是同步,因为工作数据已经共享)相结合时,可以通过单独的进程获得比 achievalbe 更好的性能。

但再一次 - 这取决于。

假设我们只考虑 MPI 和 OpenMP,因为它们是您提到的两个并行编程家族的两个主要代表。对于分布式系统,MPI 是不同节点之间的唯一选项。但是,正如您所说,在单个节点中,您仍然可以使用 MPI 并使用 OpenMP。哪一个性能更好实际上取决于您正在运行的应用程序,特别是其计算/通信比率。在这里,您可以看到多核处理器的 MPI 和 OpenMP 的比较,它们证实了相同的观察结果。

您可以更进一步,使用混合方法。在节点之间使用 MPI,然后在节点内使用 OpenMP。这称为混合 MPI+OpenMP 并行编程。您还可以在包含混合 CMP+SMT 处理器的节点中应用此功能。

您可以在此处和此处查看一些信息。此外,本文还比较了MPI方法与混合MPI+OpenMP方法。

在我看来,他们只是在不同的工作中做得更好。Actor 模型非常适合在不同时间异步执行许多不同的任务,而 OpenMP/TBB/PPL 模型非常适合非常简单可靠地并行执行一项任务。