共享内存系统性能的消息传递接口
Message passing interface on shared memory systems performance
据我所知,并行处理消息传递接口和多线程有两种方法。多线程不能用于没有消息传递接口的分布式内存系统;但是消息传递接口可用于系统"共享内存"和"分布式内存"。我的问题是关于与 MPI 并行化并在共享内存系统上运行的代码的性能。此代码的性能是否与使用多线程并行化的代码在同一范围内?
更新:
我的工作是进程需要反复相互通信,通信阵列可以是200 * 200
答案是:视情况而定。MPI 进程主要是独立的操作系统进程,当通信进程在同一共享内存节点上运行时,它们之间的通信使用某种共享内存 IPC 技术进行。作为独立的操作系统进程,MPI 进程通常不共享数据,有时必须在每个进程中复制数据,这会导致内存使用率低于最佳状态。另一方面,线程可以共享大量数据,并且可以从缓存重用中受益,尤其是在具有大型共享最后一级缓存的多核 CPU 上(例如,当前一代 x86 CPU 上的 L3 缓存)。当缓存重用与线程之间数据交换的更轻量级方法(通常只是同步,因为工作数据已经共享)相结合时,可以通过单独的进程获得比 achievalbe 更好的性能。
但再一次 - 这取决于。
假设我们只考虑 MPI 和 OpenMP,因为它们是您提到的两个并行编程家族的两个主要代表。对于分布式系统,MPI 是不同节点之间的唯一选项。但是,正如您所说,在单个节点中,您仍然可以使用 MPI 并使用 OpenMP。哪一个性能更好实际上取决于您正在运行的应用程序,特别是其计算/通信比率。在这里,您可以看到多核处理器的 MPI 和 OpenMP 的比较,它们证实了相同的观察结果。
您可以更进一步,使用混合方法。在节点之间使用 MPI,然后在节点内使用 OpenMP。这称为混合 MPI+OpenMP 并行编程。您还可以在包含混合 CMP+SMT 处理器的节点中应用此功能。
您可以在此处和此处查看一些信息。此外,本文还比较了MPI方法与混合MPI+OpenMP方法。
在我看来,他们只是在不同的工作中做得更好。Actor 模型非常适合在不同时间异步执行许多不同的任务,而 OpenMP/TBB/PPL 模型非常适合非常简单可靠地并行执行一项任务。
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何将参数包装在 C 或 C++ 中并将它们传递给系统或 exec*
- "Guaranteed Delivery"消息传递 - 我应该使用 MQTT 还是 ZeroMQ?
- 如何正确存储/传递接口类型的变量(现代 c++)?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- Microsoft具有本机消息传递和非持久连接的边缘扩展不起作用
- neak_ptr vs unique_ptr参考 - 传递接口inmand tos to其他对象
- Firebase C 云消息传递背景问题
- 从客户端到浏览器的CEF中的消息传递序列化
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 如何将WM_KEYDOWN消息传递到 IWebBrowser2 实例
- 如何在 GNU Radio 中实现消息传递
- msgpack:C++和Java之间的消息传递
- 无效输入会导致多语言 JSON 消息传递系统中的身份验证绕过
- 共享内存系统性能的消息传递接口
- 面向组件系统中的灵活数据消息传递
- 消息传递系统:回调可以是任何东西
- 与mpi(消息传递接口)兼容的biginteger库