2010-03-30 46 views
9

我需要用C++编写一个科学应用程序,其中执行大量计算并使用大量内存。我有一部分工作,但由于资源方面的高要求,我正在考虑开始转向OpenMPI用于集群和HPC的C++编程

在做这件事之前,我有一个简单的好奇心:如果我正确理解OpenMPI的原理,开发人员可以根据当时可用的节点调用SEND和RECEIVE,在不同节点上分割作业。

你知道它是否确实存在一些库或操作系统或任何有这种能力让我的代码保持原样吗?基本上,连接所有电脑的东西,让共享作为他们的内存和CPU?

我有点困惑,因为这个主题上有大量可用的材料。 我应该看看云计算吗?或分布式共享内存?

回答

5

目前没有C++库或实用程序可以让您自动将代码跨机器群并行化。当然,有很多方法可以用其他方法实现分布式计算,您真的想要优化应用程序以使用消息传递或分布式共享内存。

你最好的赌注将是:

  1. 将您的实现为基于任务的解决方案。有很多方法可以做到这一点,但这绝对是手工完成的。
  2. 清楚地确定你可以在哪里打破任务,以及这些任务如何实质上相互沟通。
  3. 使用建立在OpenMPI/Mpich上的更高级别的库 - Boost.MPI浮现在脑海。

实现并行分布式解决方案是一回事,使其高效工作是另一回事。阅读不同的拓扑结构和不同的并行计算模式,使实施解决方案比不必从头开始的痛苦少一些。

+0

嗨!非常感谢您的回复。 – 2010-03-31 15:39:54

2

如果消息传递阻止了你,尝试分布式对象。有很多可用的分布式对象框架。 CORBA,DCOM,ICE等等......如果您选择分发对象,您的对象将通过您将定义的接口(数据和方法)具有全局可见性。任何节点中的任何对象均可访问这些分布式对象。

我一直在寻找软件,允许分配内存,但没有遇到任何。我猜是因为你有所有这些分布式对象框架可用,而且人们也不需要像这样分配内存。

+0

太棒了!我听到很多关于我的一些老朋友使用的这些技术..我会问,并开始看看! – 2010-03-31 15:41:43

2

我在研究生院使用Top-C有很好的经验。

来自主页:“TOP-C特别将它自己区分为可轻松并行现有顺序应用程序的软件包。”

http://www.ccs.neu.edu/home/gene/topc.html

编辑:我要补充,这是更简单,如果用“微不足道并行”并行的程序。例如节点不需要需要共享内存。 Mapreduce建立在这个概念之上。如果您可以最大限度地减少节点使用的共享状态数量,则可以从并行处理中看到更好的数量级改进。

+0

嗨!非常感谢您的回复。我不知道这个项目!我会有一个loook! – 2010-03-31 15:40:59

4

那么,你实际上并没有确切地说明你的目标硬件是什么,如果它是共享内存的机器,那么OpenMP是一个选项。大多数并行程序员认为使用OpenMP进行并行化比使用MPI的任何形式更容易。我还建议,将OpenMP改装为现有代码比MPI更容易。从表现最好的角度来看,最好的MPI程序是从头开始设计并与消息传递并行的程序。

此外,最佳顺序算法可能并不总是最有效的算法,一旦它被平行化。有时候,一个简单但顺序次优的算法是更好的选择。

您可以访问到共享内存的计算机:

  • 所有多核CPU的有效共享内存的计算机;
  • 在许多集群上,节点通常是两个或四个强的CPU,如果它们每个都有4个内核,那么您的集群上可能有一个16核共享内存计算机;
  • 如果您有权访问MPP超级计算机,您可能会发现其每个节点都是共享内存计算机。

如果你被卡住消息传递,那么我强烈建议你坚持使用C++和的openmpi(或任何MPI已经安装在系统上),你应该在BoostMPI无疑显得太。我强烈建议这样做,因为一旦你走出高性能科学计算的主流,你可能会发现自己身处一场编程之中,拥有一套特殊的适合研究型图书馆和其他工具。 C++,OpenMPI和Boost已经被很好的使用,你可以把它们视为'武器级'或者你喜欢的类比。例如,在MPI和OpenMP上流量很少,在您投注农场之前查看其他技术的统计数据。

如果您对MPI没有经验,那么您可能需要查看一本名为并行科学计算的书,C++和MPI由Karniadakis和Kirby编写。 Gropp使用MPI可以作为参考,但它并不是初学者关于消息传递编程的文本。