据我所知,并行处理消息传递接口和多线程有两种方法。多线程不能用于没有消息传递接口的分布式内存系统;但消息传递接口可用于“共享内存”和“分布式内存”系统。我的问题是关于与 MPI 并行化并在共享内存系统上运行的代码的性能。此代码的性能是否与多线程并行化的代码范围相同?
更新:
我的工作是因为进程需要反复相互通信,通信数组可以是 200*200 矩阵
据我所知,并行处理消息传递接口和多线程有两种方法。多线程不能用于没有消息传递接口的分布式内存系统;但消息传递接口可用于“共享内存”和“分布式内存”系统。我的问题是关于与 MPI 并行化并在共享内存系统上运行的代码的性能。此代码的性能是否与多线程并行化的代码范围相同?
更新:
我的工作是因为进程需要反复相互通信,通信数组可以是 200*200 矩阵
答案是:这取决于. MPI 进程主要是独立的 OS 进程,当通信进程在同一个共享内存节点上运行时,它们之间的通信使用某种共享内存 IPC 技术进行。作为独立的操作系统进程,MPI 进程通常不共享数据,有时必须在每个进程中复制数据,这会导致内存使用不理想。另一方面,线程可以共享大量数据,并且可以从缓存重用中受益,尤其是在具有大型共享最后一级缓存的多核 CPU 上(例如当前一代 x86 CPU 上的 L3 缓存)。缓存重用与更轻量级的线程间数据交换方法(通常只是同步,因为工作数据已经共享)相结合可以带来比单独进程实现的更好的性能。
但再一次 - 这取决于。
假设我们只考虑 MPI 和 OpenMP,因为它们是您提到的两个并行编程系列的两个主要代表。对于分布式系统,MPI 是不同节点之间的唯一选择。但是,正如您所说的,在单个节点中,您仍然可以使用 MPI 和 OpenMP。哪个性能更好取决于您正在运行的应用程序,特别是它的计算/通信比率。在这里,您可以看到多核处理器的 MPI 和 OpenMP 比较,它们证实了相同的观察结果。
您可以更进一步并使用混合方法。在节点之间使用 MPI,然后在节点内使用 OpenMP。这称为混合 MPI+OpenMP 并行编程。您也可以在包含混合 CMP+SMT 处理器的节点中应用此功能。
在我看来,他们只是更擅长不同的工作。Actor 模型非常适合在不同时间异步执行许多不同的任务,而 OpenMP/TBB/PPL 模型非常适合非常简单可靠地并行执行一项任务。