【问题标题】:Sending a Lambda Closure Over MPI通过 MPI 发送 Lambda 闭包
【发布时间】:2014-12-10 20:19:24
【问题描述】:

我正在尝试使用 C++11 和 MPI 构建分布式应用程序。我想通过 MPI_send() 调用将 lambda 闭包发送到集群上的另一台计算机。

例如,假设我有以下 lambda

auto x = [x, y] () { return x + y; };

我想定义一个函数,比如pack(),这样我就可以调用 MPI 发送 -

MPI_Send(pack(f_xy), SOMESIZE, MPI_CHAR, 1, 0, MPI_COMM_WORLD);

谁能告诉我如何定义pack 函数(在接收器端也是unpack 函数?)。我一直在网上四处寻找,但没有成功找到任何方法。

【问题讨论】:

  • 确实没有办法在 C++ 中序列化一般函数或特别是 lambda - 例如,this question 或 this one。
  • @JonathanDursi an answer 对后一个问题似乎表明闭包实际上可以序列化。
  • @DmitriChubarov - 据我所知,这个答案似乎依赖于序列化函数指针或表示要执行哪个 lambda 的依赖于实现的不透明对象。但这不是函数本身,即使目标进程的内存中已经存在该函数,也没有明显可靠的方法可以将它们转换为相关函数。

标签: c++ c++11 serialization mpi openmpi


【解决方案1】:

我能想到三种方法,既不容易也不好。

首先是编译一个dll并序列化并发送它,在另一端写出来并加载并执行它。这需要与您的构建系统进行交互。它对函数对象的效果比 lambda 好得多。

第二个涉及使用诸如 boost phoenix 之类的东西来编写伪 C++,以使解析树在 C++ 中可见。然后通过网络发送带有绑定的解析树,并在另一端解释它。

第三个是在两端附加一个脚本引擎,并通过网络发送一个脚本(同样带有绑定和绑定数据)。

没有一个是简单的,也没有一个实际上是通过网络发送一个 lambda。一般来说,lambdas 是类型而不是数据,而 MPI 不支持传输类型。

【讨论】:

  • 嗯,并不是说MPI 支持或不支持传输类型或函数; MPI 只是将 1 和 0 放在网络上,并不真正关心它们是什么,除了一些语义糖以使程序员的工作更容易。这是C++(比如说)没有序列化或反序列化类型或函数或你有什么的方法。例如,使用 Python 和 MPI,可以很容易地发送序列化(腌制)的 Python 函数或对象;但这不是 C++ 或类似语言的工作方式。
  • @JonathanDursi ok:MPI C++ 包装器不支持发送函数。你可以有一个库来序列化足够相似的系统之间的实际函数。这将是一个扩展,例如fork()。哎呀,您可以将其实现为fork(),然后是子进程的核心转储,您通过线路发送并从核心转储运行。但这很愚蠢。
  • 你有任何 boost phoenix 库做这样的事情的例子吗?
  • @subzero 不。另一端会很有趣,因为它不能像 boost pheonix 那样。但是因为你可以访问发送端的解析树,所以它可以被序列化。反序列化不能是同一类型,因为类型不能由数据在线确定,相反,您基本上必须编写一个解释器。
猜你喜欢
  • 2014-08-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2012-10-23
相关资源
最近更新 更多