什么是最佳MPI实施
我必须在集群中实现MPI系统。如果这里的任何人对MPI(MPICH / OpenMPI)有任何经验,我想知道哪种更好,以及如何在x86_64机顶盒集群上提高性能。
解决方案
MPICH已经存在了很多年。它具有极高的便携性,我们会在网上找到多年的提示和技巧。这是一个安全的选择,它可能与更多的MPI程序兼容。
OpenMPI是较新的。尽管它不那么可移植,但它确实很好地支持最常见的平台。大多数人似乎认为它在几个方面要好得多,特别是对于容错而言,但是要利用这一点,我们可能必须使用MPI标准不包含的某些特殊功能。
至于性能,这在很大程度上取决于应用程序。很难给出一般性建议。我们应该发布有关要运行的计算类型,节点数以及硬件类型(包括正在使用的网络硬件类型)的特定问题。
我们之所以使用mpich仅仅是因为它似乎是最可用的并且有据可查的最好,我们在测试替代方案上没有花费很多精力。 MPICH具有在Windows上部署的合理工具。
我们遇到的主要性能问题是,我们需要将相同的基础数据发送到所有节点,并且MPICH不(或者不)支持广播,因此部署初始数据为O(n)
我已经为Windows和Linux集群编写了许多并行应用程序,并且我可以建议我们现在MPICH2可能是更安全的选择。正如其他响应者所提到的,它是一个非常成熟的库。另外,现在有足够的广播支持(通过MPI_Bcast),实际上,MPICH2具有相当不错的功能,例如分散和聚集。
不过,OpenMPI取得了一些进展。企鹅计算(它们是大型集群供应商,并且他们喜欢Linux)实际上具有一些非常强大的基准,在某些情况下,OpenMPI击败了MPICH2.
关于我们对"提升性能"的评论,我能提供的最佳建议是,如果我们受I / O约束,则永远不要发送超出绝对必要的数据,如果我们受CPU约束,则永远不要做超出必要的工作。我已经陷入了多次优化错误代码的陷阱:)希望我们不会跟上我的脚步!
查看MPI论坛,他们有很多关于MPI例程的好信息,并且Beowulf网站上有很多有趣的问题得到解答。
"更好"很难定义..."更快"可以通过用代码和硬件进行基准测试来回答。诸如集体和卸载优化之类的事情将取决于确切硬件,并且在驱动程序堆栈版本方面也存在很大差异,Google应该能够找到适合工作组合。
至于优化工作,这在某种程度上取决于代码,在某种程度上取决于硬件。
代码I / O是否绑定到存储?在这种情况下,比NFS更好的调查可能会有所帮助,或者使用MPI I / O而不是朴素的并行I / O
如果我们受网络限制,那么查看通信位置和通信/计算重叠会有所帮助。各种MPI实现中的大多数都具有用于使用本地共享内存而不是用于节点内通信的网络的调整选项,这对于某些代码可以显着减少网络负载。
I / O和MPI通信的隔离在某些群集上可能有很大的不同,特别是对于千兆以太网群集。