MPI还是套接字?

时间:2008-09-30 15:40:15

标签: c++ c cluster-computing hpc

我正在开发一个松散耦合的集群,用于某些数据处理。网络代码和处理代码已经到位,但我们正在评估我们方法中的不同方法。现在,正如我们应该的那样,我们在性能问题上受到I / O限制,我们正试图减少这个瓶颈。显然,像Infiniband这样的更快的交换机会很棒,但是我们无法承受抛弃我们拥有的东西并获得新设备的奢侈。

我提出的问题是这个。在群集上完成的所有传统和严重的HPC应用程序通常通过消息传递与直接通过套接字发送来实现。这对性能有什么好处?如果我们从套接字切换,我们应该看到加速吗?

10 个答案:

答案 0 :(得分:19)

MPI MIGHT使用套接字。但是也有与使用直接分布式共享内存的SAN(系统区域网络)一起使用的MPI实现。那当然,如果你有硬件。所以MPI允许您将来使用这些资源。在这种情况下,您可以获得巨大的性能提升(根据我在大学期间使用群集的经验,您可以达到几个数量级的增益)。因此,如果您正在编写可以移植到更高端集群的代码,那么使用MPI是一个非常好的主意。

即使丢弃性能问题,使用MPI也可以节省大量时间,您可以使用它来提高系统其他部分的性能,或者只是保存您的理智。

答案 1 :(得分:11)

我建议使用MPI而不是自己动手,除非你非常擅长这种事情。在使用我自己的协议编写了​​一些分布式计算式应用程序之后,我总是发现自己在MPI中复制(并且再现不佳)功能。

性能明智我不希望MPI给你任何有形的网络加速 - 它使用与你一样的套接字。但是,MPI将为您提供管理许多节点所需的许多功能,即节点之间的同步。

答案 2 :(得分:4)

在这种情况下,即使在高性能群集上,性能也不是唯一的考虑因素。 MPI提供标准API,并且是“可移植的”。在不同版本的MPI之间切换应用程序是相对微不足道的。

大多数MPI实现使用套接字进行基于TCP的通信。与直接使用套接字的本地应用程序相比,任何给定的MPI实现都将更好地优化并提供更快的消息传递的可能性很大。

此外,如果您有机会在具有InfiniBand的群集上运行代码,MPI层将抽象出任何这些代码更改。这不是一个微不足道的优势 - 编写应用程序直接使用OFED(或另一个IB动词)实现是非常困难的。

大多数MPI应用程序都包含小型测试应用程序,可用于独立于应用程序验证网络设置的正确性。在调试应用程序时,这是一个主要优势。 MPI标准包括“pMPI”接口,用于分析MPI调用。此界面还允许您轻松地将校验和或其他数据验证添加到所有消息传递例程。

答案 3 :(得分:3)

MPI的好处是您可以进行集体沟通。做广播/减少O(log p)/ * p是你的处理器数量* /而不是O(p)是一个很大的优势。

答案 4 :(得分:2)

我必须同意OldMan和freespace。除非您了解MPI的某些有用指标(性能,可维护性等)的具体和改进,否则为什么要重新发明轮子。 MPI代表了您正在尝试解决的问题的大量共享知识。

除了发送数据之外,还有许多问题需要解决。连接设置和维护都将成为您的责任。如果MPI是您需要的确切抽象(听起来像是),请使用它。

至少,使用MPI并稍后使用您自己的系统重构它是一个很好的方法,可以降低MPI的安装和依赖性。

我特别喜欢OldMan的观点,MPI为您提供了超越简单套接字通信的更多功能。您将获得一系列具有透明抽象的并行和分布式计算实现。

答案 5 :(得分:2)

消息传递是一种范式而非技术。在最常见的安装中,MPI将使用套接字进行通信。您可以通过切换到MPI来加快速度,但只有在您没有优化套接字通信的情况下才能看到。

您的应用程序I / O如何绑定?它是将数据块传输到工作节点,还是因为计算过程中的通信而绑定?

如果答案是“因为沟通”,那么问题是你正在编写一个紧密耦合的应用程序并尝试在为松散耦合的任务设计的集群上运行它。获得性能的唯一方法是获得更好的硬件(更快的交换机,infiniband等)...也许你可以借用别人的HPC?

如果答案是“数据块”转移,那么考虑为工作人员分配多个数据块(这样他们可以保持更长时间的忙碌)&在传输之前压缩数据块。这是一种可以帮助松散耦合的应用程序的策略。

答案 6 :(得分:1)

我没有使用过MPI,但是我使用了很多套接字。高性能套接字有几点需要考虑。你在做很多小包或大包吗?如果您正在执行许多小数据包,请考虑关闭Nagle算法以获得更快的响应:

setsockopt(m_socket,IPPROTO_TCP,TCP_NODELAY,...);

此外,在尝试获取大量数据时,使用信号实际上会慢得多。很久以前我做了一个测试程序,读者会等待一个信号,并读取一个数据包 - 它会得到一个100包/秒的回合。然后我只是阻止读取,并获得10000次读/秒。

重点是看所有这些选项,并实际测试它们。不同的条件会使不同的技术更快/更慢。重要的是不仅要获得意见,而且要对它们进行测试。 Steve Maguire在“编写固体代码”中谈到了这一点。他使用了许多反直觉的例子,并测试它们以找出更好/更快的代码。

答案 7 :(得分:0)

MPI使用下面的套接字,所以唯一的区别应该是代码与之接口的API。如果你直接使用套接字,你可以微调协议,但那就是它。你究竟在做什么数据?

答案 8 :(得分:0)

MPI使用套接字,如果你知道自己在做什么,你可能会从套接字中获得更多带宽,因为你不需要发送尽可能多的元数据。

但你必须知道自己在做什么,而且可能更容易出错。基本上你用你自己的消息传递协议替换mpi。

答案 9 :(得分:0)

对于大量,低开销的业务消息,您可能需要签出 OAMQ有几种产品。据说开源变种OpenAMQ在摩根大通进行交易,所以它应该是可靠的,不应该吗?