問題の説明:ネットワーク内の 2 つの異なる Unix マシンで 2 つのプロセスが実行されています。あるマシンから別のマシンに「こんにちは!!」などの単純なメッセージを渡す最も簡単な方法は何ですか? IPC には多くの方法があることは知っていますが、オーバーヘッドが最小限の最も単純な方法は何ですか?
Boost MPI は私のシナリオで役に立ちますか? 実装に C++ を使用しています。
問題の説明:ネットワーク内の 2 つの異なる Unix マシンで 2 つのプロセスが実行されています。あるマシンから別のマシンに「こんにちは!!」などの単純なメッセージを渡す最も簡単な方法は何ですか? IPC には多くの方法があることは知っていますが、オーバーヘッドが最小限の最も単純な方法は何ですか?
Boost MPI は私のシナリオで役に立ちますか? 実装に C++ を使用しています。
ソケット。ここにソケットのチュートリアルがあります。ソケットに慣れたら、ブーストソケットも使用できます
ソケットを使用するか (ブースト ソケットをお勧めします)、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 の優れた点は、保証されたメッセージ配信と、相互接続の詳細を抽象化する方法です。に適切なオプションを指定することで、2 つの MPI プロセスの配置を変更できますmpiexec
。両方のプロセスが同じ物理ノードに配置されている場合、メッセージの通信には共有メモリが使用されます。異なるノードに配置すると、何らかのネットワーク メカニズムが使用されます。
もちろん、それはすべてあなたのニーズに依存します。MPI ライブラリは、多くのサポート インフラストラクチャを備えた複雑なコードです。たとえば、専用のランチャー プログラム (ほとんどの場合mpiexec
またはmpirun
) を介してコードを実行する必要があり、MPI を使用して 2 つのランダムなプロセスを単純に接続することはできません (つまり、実際に起動する必要があります)。 mpiexec
/を介して両方ともmpirun
)。