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