2009-12-09 32 views
-1

我正在寻找一种框架/方法来在C++中执行消息传递分布式计算。简单分布式计算(类似于求和)(在C++中)

我目前有一个迭代,单线程算法,增量更新一些数据模型。这些更新从字面上看是叠加的,我希望尽可能多地分配(或至少是并行化)计算。数据模型可以被视为大量(独立)浮点值。由于更新都是可加性的(即交换性和关联性),因此可以以任意顺序合并来自其他节点的更新,甚至可以批量合并更新。当涉及申请更新,地图/减少范例将工​​作正常。

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

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

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

总括来说,获得体面的收敛性,低延迟是至关重要的;更新计算和更新应用程序之间的时间越长,更新的用处就越小。更新需要尽快分发给所有节点;但由于更新的交互性和关联性,这些更新是否单独广播(可能效率低下)或作为合并批次的一部分到达并不重要。

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

回答

3

你可能想要MPI(消息传递接口)。它本质上是分布式计算的行业标准。有很多的实现,但我会建议OpenMPI,因为它是免费的,并高度重视。它提供了一个C API来在节点之间传递消息,并且还提供了更高级别的功能,如广播,全部到全部,减少,分散收集等。它在TCP上工作,以及更快,更低的延迟Infiniband或Myrinet等互连,并支持各种拓扑。

MPI上还有一个Boost包装器(Boost.MPI),它将为您提供更多的C++友好界面。

+0

这看起来像一个合理的技术开始。我想批处理/合并方面不是一个解决的问题? – 2009-12-09 14:56:53