2016-03-22 44 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',則是另一種蠕蟲。 –