混合:群集上的OpenMPI + OpenMP

时间:2013-02-28 11:21:33

标签: openmp openmpi hybrid

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

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

我有一组20个这样的(24核)机器,并考虑混合实现。我想使用MPI传递这20个节点,并在每个节点使用常规的OpenMP并行性。

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

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

可能我应该创造一个"工人群体"和"饲料"他们用我的阵列或其他东西。

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

1 个答案:

答案 0 :(得分: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个相等的部分,并一次一个地为机器执行。在这种情况下,您在负载平衡方面获得的收益可能会面临失去工作管理时间成本的风险。你支付了你的钱,你可以选择。

从您的问题陈述中我不会根据预期的表现决定采用哪种解决方案,因为我希望任何方法能够在性能方面达到相同的目标,但是是时候制定有效的解决方案了。