0

問題の説明:ネットワーク内の 2 つの異なる Unix マシンで 2 つのプロセスが実行されています。あるマシンから別のマシンに「こんにちは!!」などの単純なメッセージを渡す最も簡単な方法は何ですか? IPC には多くの方法があることは知っていますが、オーバーヘッドが最小限の最も単純な方法は何ですか?

Boost MPI は私のシナリオで役に立ちますか? 実装に C++ を使用しています。

4

3 に答える 3

2

ソケット。ここにソケットのチュートリアルがあります。ソケットに慣れたら、ブーストソケットも使用できます

于 2012-11-12T07:54:31.367 に答える
2

ソケットを使用するか (ブースト ソケットをお勧めします)、ZeroMQを参照してください。ZeroMQ は、常に完全なメッセージを受信することを保証するため、実際にはより簡単かもしれません。

于 2012-11-12T08:27:48.447 に答える
1

これは簡単ですか?(のようなサードパーティ ライブラリを使用せずに、純粋な 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)。

于 2012-11-12T09:03:55.483 に答える