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

use*_*710 9 c++ multithreading tbb task openmp

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

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

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

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

Mik*_*our 10

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

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

  • @ user2485710:这在很大程度上取决于你正在做什么以及你正在用它做什么资源.我无法用任何有意义的方式来弥补这里的权衡. (3认同)

Mat*_*get 7

作为Mike Seymour的补充答案:

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

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

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

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

最后,它想要跨越单个计算机的边界,共享内存已经脱离游戏.