2

我用数值求解一些常微分方程。

我有一个非常简单(概念上)但很长的计算。有一个很长的数组(~2M 单元),对于每个单元,我需要执行数值积分。此过程应重复 1000 次。通过使用 OpenMP 并行性和一台 24 核机器,这需要大约一周的时间(这是不可接受的)。

我有一个由 20 台此类(24 核)机器组成的集群,并考虑混合实现。我想使用 MPI 来传递这 20 个节点,并在每个节点上使用常规的 OpenMP 并行性。

基本上,我需要将我很长的数组拆分为 20(nodes)X24(proccs) 个工作单元。

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

也许我应该创建一个“工人池”并用我的阵列或其他东西“喂养”他们。

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

4

1 回答 1

0

如果您的计算像您所指出的那样令人尴尬地并行,您应该期望通过将负载分散到所有 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 等份,然后一次将它们送至机器执行。在这种情况下,您在负载平衡中获得的收益可能会因作业管理的时间成本而丢失。你付你的钱,你做出选择。

从您的问题陈述中,我不会根据预期的性能来决定采用哪种解决方案,因为我希望任何方法在性能方面都能达到相同的水平,但要及时开发一个可行的解决方案。

于 2013-02-28T13:48:17.980 回答