問題描述:在網絡中的兩臺不同的Unix機器上運行有兩個進程。將簡單信息(例如「Hi !!」)從一臺機器傳遞到另一臺機器的最簡單方法是什麼?我知道有很多IPC的方法,但最簡單的方法是什麼?網絡上兩臺機器之間的消息傳遞
Boost MPI在我的場景中有用嗎?我正在使用C++來實現我的實現。
問題描述:在網絡中的兩臺不同的Unix機器上運行有兩個進程。將簡單信息(例如「Hi !!」)從一臺機器傳遞到另一臺機器的最簡單方法是什麼?我知道有很多IPC的方法,但最簡單的方法是什麼?網絡上兩臺機器之間的消息傳遞
Boost MPI在我的場景中有用嗎?我正在使用C++來實現我的實現。
使用套接字(我會建議boost套接字)或看看ZeroMQ。 ZeroMQ實際上可能更容易,因爲它可以保證總是收到完整的消息。
這很簡單嗎? (使用純MPI標準而不象Boost.MPI
任何第三方庫調用)
#include <string>
#include <iostream>
#include <mpi.h>
using namespace std;
int main (int argc, char **argv) {
// Initialise the MPI library
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size != 2) {
if (rank == 0)
cout << "ERROR: You must run this program with 2 processes" << endl;
MPI_Abort(MPI_COMM_WORLD, 0);
}
if (rank == 0) {
// Rank 0 sends the message
string hi = "Hi!";
MPI_Send((void*)hi.c_str(), hi.length()+1, MPI_CHAR,
1, 0, MPI_COMM_WORLD);
}
else {
// Rank 1 receives the message
// Probe for a message and get its actual size
MPI_Status status;
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
int len;
MPI_Get_count(&status, MPI_CHAR, &len);
// Allocate buffer space for the message and receive it
char *message = new char[len];
MPI_Recv(message, len, MPI_CHAR,
0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
cout << "Rank 1 received: " << message << endl;
delete [] message;
}
MPI_Finalize();
return 0;
}
編譯mpic++ -o mpihi.exe mpihi.cc
並執行:如果消息的長度是固定的預先
$ mpiexec -np 2 ./mpihi.exe
Rank 1 received: Hi!
的代碼可以簡化。可以使用Boost.MPI
進一步簡化它,但我從來沒有使用它,所以我不能給你提供一個例子。
MPI的美妙之處在於它保證了消息的傳遞以及它抽象出互連細節的方式。您可以通過向mpiexec
提供適當的選項來更改兩個MPI進程的位置。如果兩個進程都放在同一個物理節點上,則將使用共享內存來傳遞消息。如果放置在不同的節點上,則會使用一些網絡機制。
當然,這一切都取決於您的需求。 MPI庫是具有許多支持基礎設施的複雜代碼段,例如,你需要通過專用的啓動程序(在大多數情況下mpiexec
或mpirun
)來運行你的代碼,你不能使用MPI簡單地連接兩個隨機過程(即你真的有通過mpiexec
/mpirun
推出他們兩個)。
謝謝你的例子,請你可以解釋一下,如果我想發送運行在機器「A」上的進程「新」的消息來處理運行在機器「B」上的「發佈」,那麼MPI將是有用的或者套接字或者某些其他機制 – user1755967
如果兩個進程都是獨立啓動的(例如,它們是由'init'機制啓動的系統守護進程),那麼在這種情況下集成MPI可能非常困難。否則,您可以在MPI消息中發送任何您喜歡的內容。 MPI甚至支持異構環境,並且大多數實現可以在不同的內部表示之間動態地轉換消息數據,例如,一個大端的64位機器可以透明地將整數發送到一個32位的小端機器。 –
我的進程不是守護進程,它實際上就像在機器A上運行的Process「new」應該在機器B上調用進程「publish」,所以像publish.exe這樣的簡單消息應該在機器B上運行,並通過機器A調用A – user1755967
UDP/TCP連接併發送一些字節 –