简单分布式计算(类似于求和)(在C ++中)

时间:2009-12-09 09:54:38

标签: c++ parallel-processing distributed

我正在寻找一种框架/方法来用C ++进行消息传递分布式计算。

我目前有一个迭代的单线程算法,可逐步更新某些数据模型。这些更新实际上是附加的,我想在尽可能多的机器+内核上分发(或至少并行化)计算。数据模型可以被视为一个(独立的)浮点值的大数组。

由于更新都是附加的(即可交换和关联),因此可以按任意顺序合并来自其他节点的更新,甚至可以批量合并更新。在应用更新时,map / reduce范例可以正常工作。

另一方面,相对于当前模型状态,更新是计算。每个步骤都“纠正”了一些缺陷,因此用于计算更新的模型尽可能新鲜是很重要的(模型越过时,更新就越不实用)。最糟糕的情况是,更新完全依赖,并行性没有任何好处。

我从来没有实现任何灵活可分发的东西,但这看起来像是一个主要的候选人。因此,我正在寻找一些框架或方法来分发更新(主要包括浮点数和一些索引到数组中以确定添加更新的位置)。但是,我不确定如何:

  • 我可以向所有连接的进程广播更新。但这意味着大量的网络流量,所以我实际上需要批量更新;然后更新将更少。无论如何,这看起来并不可扩展。
  • 我可以做某种环形拓扑。基本上,一台机器向下一台机器发送它自己的更新和它的前辈的更新。但是我需要弄清楚如何重复更新,毕竟,戒指是循环的,最终它自己的更新将作为其前任总和的一部分到达。
  • 或某种树结构...

总而言之,要获得良好的收敛性能,低延迟至关重要;更新计算和更新应用程序之间的时间越长,更新就越少。需要尽快将更新分发到所有节点;但由于更新的可交换性和相关性,这些更新是单独广播(可能效率低下)还是作为合并批次的一部分到达并不重要。

是否有人知道任何现有的加速开发的框架或方法?甚至只是一般指针?我从来没有做过这样的事......

2 个答案:

答案 0 :(得分:3)

您可能需要MPI(消息传递接口)。它本质上是分布式计算的行业标准。有很多实现,但我会推荐OpenMPI,因为它既免费又备受推崇。它为您提供了一个C API,用于在节点之间传递消息,还提供更高级别的功能,如广播,全能,减少,分散 - 聚集等。它可以通过TCP工作,以及更快,更低的延迟Infiniband或Myrinet等互连,支持各种拓扑结构。

围绕MPI(Boost.MPI)还有一个Boost包装器,它将为您提供更友好的C ++接口。

答案 1 :(得分:1)

您是否在寻找Boost.MPI之类的内容?