线程与共享内存和MPI之间的主要区别
Main differences between threading with shared memory and MPI?
虽然我一直在玩pthreads, OpenMP, intel TBB和线程一般有一段时间了,但我仍然不明白消息传递接口实现(如OpenMP)和经典线程库之间的主要区别是什么,我仍然不清楚。
假设为线程池编写所有样板代码在我的情况下不是问题,并且我使用c++,这两种技术之间的区别归结为……
?我也对在网络上操作线程,同时将任务分配给所有连接的机器感兴趣。
现在我也不考虑OpenMP/OpenMPI支持的平台数量方面的限制,因为我想了解这两个概念是如何工作的。
"Classic"线程在线程之间共享所有内存。这是相当危险的,因为很容易意外地修改另一个线程可能正在使用的数据,从而导致严重的错误。程序员有责任小心地保护数据免受不安全的访问。这也(通常)要求所有进程在同一台机器上运行,并访问相同的物理内存。
使用具有消息传递接口的独立进程可以让您更好地控制每个进程共享哪些数据,哪些数据是私有的;一个进程意外修改另一个进程状态的危险很小,或者根本没有危险。正如您所说,消息传递接口可以被概括为在不同机器上的进程之间通过网络传递消息。作为对Mike Seymour回答的补充:
主要的权衡取决于你必须在进程和线程之间共享什么。使用共享内存,实际上是在执行上下文之间共享数据。
对于消息传递,您需要复制数据以便在执行上下文(线程、进程、多台计算机上的进程)之间传递。
如果与上下文的执行时间相比,您的数据很小(读取:数据传输时间很小),那么与共享内存相比,MPI应该不会有很大的开销。
相反,如果要共享的数据很大(数据传输时间)与执行时间具有相同的数量级,那么MPI可能不是一个好主意。
最后,如果你想跨越单个计算机的边界,共享内存是不可能的。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?