【问题标题】:Message passing between two machines on a network网络上两台机器之间的消息传递
【发布时间】:2012-10-31 15:23:46
【问题描述】:

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

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

【问题讨论】:

  • UDP/TCP连接并发送一些字节

标签: c++ boost mpi distributed-computing


【解决方案1】:

套接字。这是一个套接字tutorial。一旦你掌握了套接字,你也可以使用boost sockets

【讨论】:

  • 为什么我不能使用 Boost:MPI 因为我只需要传递一条小消息?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这够简单吗? (使用纯 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 库是具有大量支持基础设施的复杂代码片段,例如您需要通过专门的启动程序运行您的代码(在大多数情况下是mpiexecmpirun),并且您不能使用 MPI 来简单地连接两个随机进程(即您真的来启动它们通过mpiexec/mpirun)。

    【讨论】:

    • 谢谢你的例子,请你解释一下,如果我想从运行在机器“A”上的进程“new”发送消息到运行在机器“B”上的进程“publish”,那么 MPI将是有用的或套接字或其他一些机制
    • 如果两个进程都是独立启动的(例如它们是由init机制启动的系统守护进程),那么在这种情况下集成MPI可能会非常困难。否则,您可以在 MPI 消息中发送您喜欢的任何内容。 MPI 甚至支持异构环境,并且大多数实现可以在不同的内部表示之间动态转换消息数据,例如big-endian 64 位机器可以透明地将整数发送到 32 位 little-endian 机器。
    • 我的进程不是守护进程,实际上就像在机器 A 上运行的进程“新”应该调用机器 B 上的进程“发布”,所以像 publish.exe 这样的简单消息应该在机器 B 上运行,通过调用机器A
    • 听起来您还想执行远程启动。 MPI 支持在运行时生成其他进程并提供与它们通信的方法。不过,您仍然需要通过mpiexec 运行。
    • 正是我想要远程启动“发布”进程和它们之间的通信,请你能给我一些好的教程,让我有想法在 C++ 中实现这个问题
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 2012-02-12
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多