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

时间:2013-06-14 10:52:03

标签: c++ multithreading task openmp tbb

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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

使用带有消息传递接口的独立进程,您可以更好地控制共享哪些数据以及哪些数据对每个进程都是私有的;一个进程意外地修改另一个进程的状态几乎没有危险。正如您所说,消息传递接口可以通用化,以便在不同计算机上的进程之间通过网络传递消息。

答案 1 :(得分:7)

作为Mike Seymour的补充回答:

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

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

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

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

最后,你想跨越一台计算机的界限,共享内存已经不在游戏中了。

相关问题