C++ 通过MPI发送Lambda闭包

C++ 通过MPI发送Lambda闭包,c++,c++11,serialization,mpi,openmpi,C++,C++11,Serialization,Mpi,Openmpi,我正在尝试用C++11和MPI构建一个分布式应用程序。我想通过MPI\u send()调用将lambda闭包发送到集群上的另一台计算机 例如,假设我有以下lambda auto x = [x, y] () { return x + y; }; 我想定义一个函数,比如说pack(),这样我就可以调用MPI send- MPI_Send(pack(f_xy), SOMESIZE, MPI_CHAR, 1, 0, MPI_COMM_WORLD); 有人能告诉我如何定义pack功能(也是接收器端的u

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

例如,假设我有以下lambda

auto x = [x, y] () { return x + y; };
我想定义一个函数,比如说
pack()
,这样我就可以调用MPI send-

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

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

我可以想出三种方法,既不简单也不好

第一种方法是编译一个dll,将其序列化并发送,在另一端写出,然后加载并执行它。这需要与构建系统交互。它对函数对象的效果要比lambda好得多

第二种方法是使用类似Boost凤凰的东西来编写伪C++,以解析树从C++中可见的方式。然后通过连接发送带有绑定的解析树,并在另一端对其进行解释

第三种方法是将脚本引擎连接到两端,并通过网络发送脚本(同样带有绑定和绑定数据)


没有一个是容易的,也没有一个是通过电线发送lambda的。一般来说,lambdas比数据更为类型,MPI不支持传输类型。

实际上,没有一种方式可以在一般或lambdas中序列化函数,特别是在C++ + EG,或.J.JONATANURSIAN中,后者的问题似乎暗示闭包实际上可以被序列化。这个答案似乎依赖于序列化函数指针或表示要执行哪个lambda的依赖于实现的不透明对象。但这不是函数本身,即使目标进程内存中已经存在相关函数,也没有明显的健壮方法将其转换为相关函数;MPI只是把1和0放在电线上,并不真正关心它们是什么,只是为了让程序员的工作更容易一些。这是C++(SH)没有序列化或不序列化类型或函数的方式或是什么。例如,使用Python和MPI,可以非常轻松地发送序列化(pickle)Python函数或对象;但这不是C++语言或类似语言的工作原理。C++ JONATANDURSI OK:MPI C++包装不支持发送函数。您可以有一个库,它可以在足够相似的系统之间序列化实际函数。它将是一个扩展,如
fork()
。见鬼,您可以将其实现为
fork()
,然后是子进程的核心转储,您可以通过线路发送它并从核心转储运行。但那太傻了。你有任何boost phoenix库做这种事情的例子吗?@subzero-no。另一端会很有趣,因为它不能像凤凰一样。但由于您可以访问发送端的解析树,因此可以对其进行序列化。反序列化不能是同一类型,因为类型不能由连线上的数据确定,相反,您必须基本上编写一个解释器。