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