线程与共享内存和MPI之间的主要区别

Main differences between threading with shared memory and MPI?

本文关键字:区别 之间 MPI 共享 内存 线程      更新时间:2023-10-16

虽然我一直在玩pthreads, OpenMP, intel TBB和线程一般有一段时间了,但我仍然不明白消息传递接口实现(如OpenMP)和经典线程库之间的主要区别是什么,我仍然不清楚。

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

?

我也对在网络上操作线程,同时将任务分配给所有连接的机器感兴趣。

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

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

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

作为对Mike Seymour回答的补充:

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

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

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

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

最后,如果你想跨越单个计算机的边界,共享内存是不可能的。