共享内存多线程和MPI的主要区别是什么?

14

虽然我已经使用pthreads、OpenMP、Intel TBB以及多线程技术玩了一段时间,但我仍然不明白像OpenMP这样的消息传递接口实现与经典线程库之间的主要区别是什么,对于我来说还不清楚。

假设在我的情况下编写所有线程池的样板代码不是问题,并且我正在使用C++,那么这两种技术之间的区别就归结为...?

我还对在线程网络化操作时将任务分配给所有连接机器感兴趣。

此时,我也不考虑OpenMP/OpenMPI所支持平台数量方面的限制,因为我想了解这两个概念的工作原理。


1
消息传递接口实现,例如__OpenMPI__... - Massimiliano
2个回答

14

"经典"的线程共享所有内存。这相当危险,因为很容易意外修改另一个线程可能正在使用的数据,导致严重的错误。程序员需要仔细保护数据以防止不安全访问。通常情况下,这还要求所有进程在同一台机器上运行,并具有对相同物理内存的访问权限。

使用具有消息传递接口的独立进程可以更好地控制哪些数据是共享的,哪些是每个进程私有的; 几乎没有一个进程会意外地修改另一个进程的状态的危险。正如你所说,消息传递接口可以被推广到在分别位于不同计算机上的进程之间传递消息。


1
而性能、可移植性和成本方面呢?它们之间的权衡是什么? - user2485710
3
这取决于你正在做什么以及你用来做这件事的资源。我无法在这里详细解释权衡利弊。 - Mike Seymour
1
但这正是我所问的核心,我在哪里可以找到这些信息? - user2485710

9
作为对Mike Seymour回答的补充:
主要的权衡取决于你需要在进程和线程之间共享什么。通过共享内存,你实际上在执行上下文之间共享数据。
使用消息传递,你需要复制数据以在执行上下文(线程、进程、跨多台计算机的进程)之间传递数据。
如果你的数据很小(即:数据传输时间很短),与上下文的执行时间相比,那么MPI与共享内存相比应该没有明显的开销。
相反,如果要共享的数据很大(数据传输时间与执行时间同阶),那么MPI可能不是一个好主意。
最后,如果想要跨越单个计算机的边界,共享内存就不再适用了。

共享内存跨多台计算机是可能的,需要使用专门的硬件(共享反射内存)和库...根据应用程序的目的,您可以创建要求某些软件需要特定硬件的需求。 - g19fanatic
在MPI中,我更改上下文时不需要支付费用吗?MPI是否提供协议以保持工作人员同步并完成任务?我的意思是处理像机器离线或工人产生错误结果等通常发生在网络环境中的事情的协议。 - user2485710
@g19fanatic:没错。如果是在标准(消费级)硬件的背景下回答的话。 - Matthieu Rouget
@user2485710:我对OpenMPI的了解不足以回答这个问题。我的观点是关于共享内存和消息传递架构之间的主要区别。 - Matthieu Rouget
商业ScaleMP vSMP提供了一个虚拟分布式共享内存平台,可以在几乎所有的普通硬件上运行(只要将InfiniBand视为普通网络)。Intel Cluster OpenMP也提供了一种在分布式系统上运行OpenMP的方式,而且代码更改非常小。不幸的是,Intel终止了该项目。 - Hristo Iliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接