2013-02-28 62 views
2

我用数值求解一些常微分方程。Hybrid:群集上的OpenMPI + OpenMP

我有一个非常简单的(概念上)但很长的计算。有一个非常长的阵列(~2M单元格),并且我需要执行数值积分的每个单元格。这个程序应该重复1000次。通过使用OpenMP并行机制和一台24核机器,需要大约一周的时间才能完成(这是不可接受的)。

我有20个这样的(24核心)机器的集群,并考虑混合实施。我想使用MPI来传递这20个节点,并且在每个节点上使用常规的OpenMP并行机制。

基本上,我需要将我很长的阵列拆分为20个(节点)X24(proccs)工作单元。

有没有更好的实施或更好的想法的建议?我已经阅读了很多关于这个主题的文章,并且我有印象,有时候这种混合实现不一定会带来真正的加速。

也许我应该创建一个“工作者池”,并用我的数组或其他东西“喂”他们。

欢迎任何建议和有用的链接!

+0

任何良好答案都需要更多信息:进程或运行个别计算的线程之间需要什么通信?借助OpenMP,这些通信通常会伪装成共享内存访问。换句话说,与您的计算有多么接近?令人尴尬的并行*最后,你的硬件上是否安装了诸如Grid Engine之类的作业管理系统? – 2013-02-28 12:04:58

+0

我需要联系我们的系统管理员以了解任何Grid Engine,但到目前为止,我从未听说过我们的计算群集上有这样的引擎。 – 2013-02-28 12:48:17

+0

我需要联系我们的系统管理员以了解任何Grid Engine,但到目前为止,我从未听说过我们的计算群集上有这样的引擎。 所以,暂且让我们考虑一下没有任何网格引擎。 我的程序非常尴尬并行(!)。假设您需要 以任意单元格的顺序在巨大数组的每个单元上应用某个函数。 (即对于参数(角度)的给定矩阵(阵列),计算每个参数(角度)的Cos的矩阵)。但是“Cos”的计算时间和矩阵的大小非常大。 – 2013-02-28 12:54:07

回答

0

如果您的计算结果与您所指出的一样令人尴尬,那么您应该通过将负载分散到所有20台机器上来加快速度。由good我的意思是close to 20close to 20我的意思是你实际得到的任何数字,这让你认为努力是值得的。

你提出的混合解决方案当然是可行的,如果你实现它,你应该得到很好的加速。

混合MPI + OpenMP程序的一个替代方案是一个作业脚本(用您喜欢的脚本语言编写),它将您的大型数组简单地分成20个部分并启动20个作业,每个机器上运行一个程序实例。当他们已经完成了另一个脚本准备重新组合结果。这将避免必须编写任何MPI代码。

如果您的计算机安装了Grid Engine,则可以编写作业提交脚本,将其作为阵列作业提交,并让Grid Engine负责将工作划分给各个机器/任务。我希望其他工作管理系统有类似的设施,但我不熟悉它们。

另一种选择是全MPI代码,即完全删除OpenMP并修改代码以使用它在运行时找到的任何处理器。再说一遍,如果你的程序需要很少或没有进程间的通信,你应该得到很好的加速。

在共享内存计算机上使用MPI有时比OpenMP更好(在性能方面),有时甚至更糟。麻烦的是,很难确定哪种方法更适合特定的具有RAM和高速缓存以及互连和总线以及所有其他变量需要考虑的架构上的特定程序。

我忽略了一个因素,主要是因为您没有提供任何数据可供考虑,因此您的程序需要进行负载平衡。如果您将非常大的数据集分成20个相同大小的数据块,那么最终会有20个相同时间的作业?如果不是这样,并且如果你有一个想法,即工作时间如何随着投入而变化,那么你可能在分工方面做得更加复杂,而不是简单地把你分成20个相等的部分。例如,你可以将它切成2000个相等的部分,并一次将它们提供给机器执行。在这种情况下,您在负载平衡方面所获得的优势可能会失去作业管理的时间成本。你付钱,你需要你的选择。

从你的问题陈述我不会根据预期的表现来决定采用哪种解决方案,因为我期望任何方法都能在性能方面进入相同的球场,但是开发工作解决方案的时间。

+0

很好的回答!我确信,对于共享内存,最好使用OpenMP而不是MPI,但现在我认为只是按照MPI的建议重写我的程序,让程序访问整个集群上所有可用的处理器(20X24 )。关于我的阵列的大小,它是灵活的,因为它是一个网格,我可以调整其大小,以计算单位的大小,以获得最大的负载。 – 2013-02-28 14:51:06