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