9

I need to write a scientific application in C++ doing a lot of computations and using a lot of memory. I have part of the job but due to high requirements in terms of resources I was thinking to start moving to OpenMPI.

Before doing that I have a simple curiosity: If I understood the principle of OpenMPI correctly it is the developer that has the task of splitting the jobs over different nodes calling SEND and RECEIVE based on node available at that time.

Do you know if it does exist some library or OS or whatever that has this capability letting my code reamain as it is now? Basically something that connects all computers and let share as one their memory and CPU?

I am a bit confused because of the huge volume of material available on the topic. Should I look at cloud computing? or Distributed Shared Memory?

4

4 回答 4

5

目前没有 C++ 库或实用程序可以让您跨机器集群自动并行化您的代码。假设有很多方法可以通过其他方法实现分布式计算,您确实希望优化您的应用程序以使用消息传递或分布式共享内存。

您最好的选择是:

  1. 将您的实施转换为基于任务的解决方案。有很多方法可以做到这一点,但这绝对是手工完成的。
  2. 清楚地确定您可以在哪里分解任务以及这些任务本质上如何相互通信。
  3. 使用基于 OpenMPI/Mpich 构建的更高级别的库——我想到了 Boost.MPI。

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

于 2010-03-31T09:58:04.437 回答
4

好吧,您实际上并没有确切说明您的目标硬件是什么,如果它是共享内存机器,那么 OpenMP 是一个选项。大多数并行程序员会认为使用 OpenMP 进行并行化比在其任何形式中使用 MPI 更容易。我还建议将 OpenMP 改造为现有代码比 MPI 更容易。最好的,在最佳性能的意义上,MPI 程序是那些从头开始设计为与消息传递并行的程序。

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

您可能有权访问共享内存计算机:

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

如果您坚持使用消息传递,那么我强烈建议您坚持使用 C++ 和 OpenMPI(或您的系统上已经安装的任何 MPI),并且您也应该看看 BoostMPI。我强烈建议您这样做,因为一旦您走出高性能科学计算的主流,您可能会发现自己处于一个编程大军中,其中包含适合研究的库和其他工具的特殊集合。C++、OpenMPI 和 Boost 使用得非常好,您可以将它们视为“武器级”或任何您喜欢的类比。SO 上的流量很少,例如,在 MPI 和 OpenMP 上,请先查看其他技术的统计数据,然后再将它们押在农场上。

如果您没有使用 MPI 的经验,那么您可能想看看 Karniadakis 和 Kirby 所著的一本书,名为Parallel Scientific Computing in C++ and MPI使用Gropp等人的 MPI 可以作为参考,但它不是关于消息传递编程的初学者文本。

于 2010-04-01T10:02:57.680 回答
2

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

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

于 2010-03-30T21:15:37.970 回答
2

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

来自主页:“TOP-C 尤其将自己区分为一个可以轻松并行化现有顺序应用程序的包。”

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

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

于 2010-03-31T14:27:37.630 回答