如果您的计算结果与您所指出的一样令人尴尬,那么您应该通过将负载分散到所有20台机器上来加快速度。由good
我的意思是close to 20
和close to 20
我的意思是你实际得到的任何数字,这让你认为努力是值得的。
你提出的混合解决方案当然是可行的,如果你实现它,你应该得到很好的加速。
混合MPI + OpenMP程序的一个替代方案是一个作业脚本(用您喜欢的脚本语言编写),它将您的大型数组简单地分成20个部分并启动20个作业,每个机器上运行一个程序实例。当他们已经完成了另一个脚本准备重新组合结果。这将避免必须编写任何MPI代码。
如果您的计算机安装了Grid Engine,则可以编写作业提交脚本,将其作为阵列作业提交,并让Grid Engine负责将工作划分给各个机器/任务。我希望其他工作管理系统有类似的设施,但我不熟悉它们。
另一种选择是全MPI代码,即完全删除OpenMP并修改代码以使用它在运行时找到的任何处理器。再说一遍,如果你的程序需要很少或没有进程间的通信,你应该得到很好的加速。
在共享内存计算机上使用MPI有时比OpenMP更好(在性能方面),有时甚至更糟。麻烦的是,很难确定哪种方法更适合特定的具有RAM和高速缓存以及互连和总线以及所有其他变量需要考虑的架构上的特定程序。
我忽略了一个因素,主要是因为您没有提供任何数据可供考虑,因此您的程序需要进行负载平衡。如果您将非常大的数据集分成20个相同大小的数据块,那么最终会有20个相同时间的作业?如果不是这样,并且如果你有一个想法,即工作时间如何随着投入而变化,那么你可能在分工方面做得更加复杂,而不是简单地把你分成20个相等的部分。例如,你可以将它切成2000个相等的部分,并一次将它们提供给机器执行。在这种情况下,您在负载平衡方面所获得的优势可能会失去作业管理的时间成本。你付钱,你需要你的选择。
从你的问题陈述我不会根据预期的表现来决定采用哪种解决方案,因为我期望任何方法都能在性能方面进入相同的球场,但是开发工作解决方案的时间。
任何良好答案都需要更多信息:进程或运行个别计算的线程之间需要什么通信?借助OpenMP,这些通信通常会伪装成共享内存访问。换句话说,与您的计算有多么接近?令人尴尬的并行*最后,你的硬件上是否安装了诸如Grid Engine之类的作业管理系统? – 2013-02-28 12:04:58
我需要联系我们的系统管理员以了解任何Grid Engine,但到目前为止,我从未听说过我们的计算群集上有这样的引擎。 – 2013-02-28 12:48:17
我需要联系我们的系统管理员以了解任何Grid Engine,但到目前为止,我从未听说过我们的计算群集上有这样的引擎。 所以,暂且让我们考虑一下没有任何网格引擎。 我的程序非常尴尬并行(!)。假设您需要 以任意单元格的顺序在巨大数组的每个单元上应用某个函数。 (即对于参数(角度)的给定矩阵(阵列),计算每个参数(角度)的Cos的矩阵)。但是“Cos”的计算时间和矩阵的大小非常大。 – 2013-02-28 12:54:07