关于api:点差vs.MPI vs.zeromq?

关于api:点差vs.MPI vs.zeromq?

Spread vs MPI vs zeromq?

在具有TCP可靠性的UDP之类的广播的答案之一中,用户提到了Spread消息传递API。我也遇到过一个叫?MQ的问题。我也对MPI有所了解。

所以,我的主要问题是:为什么我要选择一个?更具体地说,当有成熟的MPI实现时,为什么选择使用Spread或?MQ?


MPI被认为是具有快速,可靠网络的紧密耦合的计算集群。 Spread和?MQ是为大型分布式系统设计的。如果要设计并行的科学应用程序,请使用MPI,但是如果要设计一个持久的分布式系统,需要对故障和网络不稳定具有弹性,请使用其中之一。

MPI的容错功能非常有限;大多数实现中的默认错误处理行为是系统范围的故障。同样,MPI的语义要求最终发送的所有消息都必须被使用。这对于在群集上进行仿真非常有意义,但对于分布式应用程序则没有意义。


我没有使用这些库中的任何一个,但是我也许可以给出一些提示。

  • MPI是一种通信协议,而Spread和?MQ是实际的实现。
  • MPI来自"并行"编程,而Spread来自"分布式"编程。
  • 因此,这实际上取决于您是要构建并行系统还是分布式系统。它们彼此相关,但是隐含的含义/目标是不同的。并行编程通过同时使用多台计算机来处理增加的计算能力。分布式编程处理可靠(一致,容错和高可用性)的计算机组。

    "可靠性"的概念与TCP的概念稍有不同。 TCP的可靠性是"无论如何都将此包交给最终程序"。分布式编程的可靠性是"即使某些机器死了,系统作为一个整体仍将继续以一致的方式工作"。为了真正保证所有参与者都收到消息,一个人将需要两阶段提交或更快的替代方法之一。


    您在这里处理的API截然不同,它们对所提供的服务类型和每种服务的基础结构有不同的看法。我对MPI和Spread知之甚少,但是我可以通过ZeroMQ来提供更多帮助。

    ZeroMQ是一个简单的消息传递通信库。它仅基于有限的一组通用消息传递模式(PUSH / PULL,REQUEST / REPLY,PUB / SUB等)将消息发送给不同的对等方(包括本地的对等方)。它严格根据这些模式来处理客户端连接,检索和基本拥塞,其余工作您必须自己做。

    尽管看起来很受限制,但这种简单的行为通常是应用程序通信层所需的行为。它使您可以使用节点之间的简单代理和网关,从内存中的简单原型迅速扩展到各种环境中的更复杂的分布式应用程序。但是,不要期望它进行节点部署,网络发现或服务器监视。您必须自己做。

    简而言之,如果您有一个应用程序想要从简单的多线程进程扩展到分布式可变环境,或者想要快速进行实验和原型设计并且似乎没有适合您的模型的应用程序,请使用zeromq。但是,如果要扩展到非常大的群集,则期望必须在网络的部署和监视上付出一些努力。


    推荐阅读