2016-03-22 43 views
0

我目前正在实现一个基于消息分拣的实现,以将装载GPU的另一个节点的计算密集型工作卸载。 所以我得到了一个主/从模型,主机生成数据,并希望它在从机(+附加GPU)上进行计算。 我已经使用OpenMPI实现了这一点,我在这两个节点上启动我的程序并通过消息传递发送数据。 我现在想要做的是改变从站的实现,使它永久运行并等待数据,直到某些主机连接到它。而这个主机可能是一个Windows或Linux主机。 所以我不想用mpirun启动master &,但只是主机正常,并希望它在运行时连接到我的slave。 另一个要求是我使用的模板类在编译时并不知道。我开始创建一个简单的TCP协议,它只是一个带有消息标记(无符号短)和结构中的有效载荷/数据(作为联合)的结构。这是我不能在联合中使用模板类的问题(这是有道理的)。C++消息像MPI一样传递库

因此,为了解决我的问题,我正在寻找一个消息传递高级库,MPI类语法最佳。有没有办法做到这一点? 就像使用MPI但不是mpirun,而是在运行时连接到其他进程。

+0

zeromq浮现在脑海中 –

+0

0mq也许? https://en.wikipedia.org/wiki/ZeroMQ –

+0

@David,Severin:zeromq的创建者发布了它的替代品,nanomsg –

回答

1

MPI确实提供了连接服务器/客户端进程的工具。这在the standard的第10.4节中讨论,一个用例是:

服务器想要接受来自多个客户端的连接。客户端和服务器都可以是并行程序。

基本上,这涉及,在服务器上MPI_Open_port/MPI_Comm_accept,和MPI_Comm_connect在客户侧。有一些(名称发布)用于建立连接。

但是,它似乎是一个很少使用的功能,我不确定不同的实现处理该功能有多好。即使标准警告,这并不意味着是一个特别强大的解决方案。

虽然Boost.MPI似乎不直接支持,但当您使用C接口建立连接时,仍应该可以使用Boost.MPI来进行实际通信。

+1

Open MPI实现它。问题是'MPI_Comm_accept'是一个阻塞调用,并没有与'select(2)'等价的功能。这意味着服务器必须逐一处理客户端或者线程化。而MPI多线程,尤其是'MPI_THREAD_MULTIPLE',则是另一种蠕虫。 –