13

虽然我一直在玩 pthreads、OpenMP、intel TBB 和线程,但我仍然不明白像 OpenMP 这样的消息传递接口实现和经典线程库之间的主要区别是什么,我仍然不清楚。

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

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

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

4

2 回答 2

14

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

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

于 2013-06-14T11:01:39.620 回答
9

作为对 Mike Seymour 回答的补充:

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

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

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

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

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

于 2013-06-14T11:51:44.947 回答