0

问题描述:有两个进程在网络中的两台不同的 Unix 机器上运行。将简单消息(例如“嗨!!”)从一台机器传递到另一台机器的最简单方法是什么?我知道 IPC 的方法有很多,但最简单且开销最小的方法是什么?

Boost MPI 在我的场景中有用吗?我正在使用 C++ 来实现。

4

3 回答 3

2

使用套接字(我建议提升套接字)或查看ZeroMQ。ZeroMQ 实际上可能更容易,因为它保证始终接收完整的消息。

于 2012-11-12T08:27:48.447 回答
2

插座。这是一个套接字教程。一旦掌握了插座,您还可以使用升压插座

于 2012-11-12T07:54:31.367 回答
1

这足够简单吗?(使用纯 MPI 标准调用,没有任何 3rd 方库,如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 的优点在于它有保证的消息传递以及它抽象互连细节的方式。您可以通过提供适当的选项来更改两个 MPI 进程的位置mpiexec。如果两个进程都放在同一个物理节点上,则共享内存将用于传递消息。如果放在不同的节点上,就会使用一些网络机制。

当然,这一切都取决于您的需求。MPI 库是具有许多支持基础设施的复杂代码,例如,您需要通过专用的启动程序(在大多数情况下)运行代码,mpiexec并且mpirun您不能使用 MPI 简单地连接两个随机进程(即您确实必须启动他们都通过mpiexec/ mpirun)。

于 2012-11-12T09:03:55.483 回答