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

C++ 共享内存线程和MPI线程的主要区别是什么?,c++,multithreading,task,openmp,tbb,C++,Multithreading,Task,Openmp,Tbb,虽然我已经使用pthreads、OpenMP、intel-TBB和线程有一段时间了,但我仍然不明白像OpenMP这样的消息传递接口实现和经典线程库之间的主要区别是什么,我仍然不清楚 假设为线程池编写所有样板代码,在我的情况下,这不是问题,我使用C++,这2种技术之间的差异归结为……p> 我还对在网络上使用线程进行操作感兴趣,同时将任务分发给所有连接的机器 目前,我也没有考虑OpenMP/支持的平台数量方面的限制,因为我想了解这两个概念是如何工作的。“经典”线程在线程之间共享所有内存。这是相当危险

虽然我已经使用pthreads、OpenMP、intel-TBB和线程有一段时间了,但我仍然不明白像OpenMP这样的消息传递接口实现和经典线程库之间的主要区别是什么,我仍然不清楚

假设为线程池编写所有样板代码,在我的情况下,这不是问题,我使用C++,这2种技术之间的差异归结为……p> 我还对在网络上使用线程进行操作感兴趣,同时将任务分发给所有连接的机器

目前,我也没有考虑OpenMP/支持的平台数量方面的限制,因为我想了解这两个概念是如何工作的。

“经典”线程在线程之间共享所有内存。这是相当危险的,因为很容易意外地修改另一个线程可能正在使用的数据,从而导致严重的bug。程序员有责任小心地保护数据,防止不安全的访问。这也(通常)要求所有进程都在同一台机器上运行,并访问相同的物理内存


通过使用带有消息传递接口的独立进程,您可以更好地控制哪些数据是共享的,哪些是每个进程的私有数据;一个进程意外修改另一个进程的状态的危险很小或没有。正如您所说,消息传递接口可以概括为在不同机器上的进程之间通过网络传递消息。

作为Mike Seymour答案的补充:

主要的权衡取决于进程和线程之间必须共享的内容。使用共享内存,您实际上可以在执行上下文之间共享数据

使用消息传递,您需要复制数据以在执行上下文(线程、进程、多台计算机上的进程)之间传递数据

如果与上下文的执行时间相比,您的数据很小(读取:数据传输时间很短),那么与共享内存相比,MPI的开销应该不会很大

相反,如果要共享的数据很大(数据传输时间)与您的执行时间具有相同的数量级,那么MPI可能不是一个好主意


最后,如果你想跨越一台计算机的界限,共享内存就不存在了。

那么性能、便携性和成本呢?权衡是什么?@user2485710:这在很大程度上取决于你在做什么以及你在使用什么资源来做这件事。我无法以任何有意义的方式来讨论这里的权衡。但这正是我要问的核心问题,在哪里可以找到这些信息?通过专用硬件(共享反射内存)和库,跨多台计算机共享内存是可能的。。。根据应用程序的用途,您可以创建特定软件需要特定硬件的需求。在MPI中,我不为更改上下文支付费用吗?MPI是否提供了一个协议来保持工作人员同步并完成任务?我指的是一种协议,用于处理诸如机器脱机或工作人员的不良结果之类的事情,以及通常在网络相关环境中发生的事情。@g19fanatic:对。If是在标准(消费者级)硬件环境下回答的。@user2485710:我对OpenMPI了解不够,无法回答这一点。我的观点是共享内存和消息传递架构之间的主要区别。商业SaleMMP VSMP提供了一个虚拟的分布式共享内存平台,它运行在相当多的商品硬件上(只要人们可以考虑无限带宽的商品网络)。Intel Cluster OpenMP还提供了一种在分布式系统上运行OpenMP的方法,只需极少的代码更改。不幸的是,Intel终止了该项目。消息传递接口实现,如OpenMPI。。。