问题描述:有两个进程在网络中的两台不同的 Unix 机器上运行。将简单消息(例如“嗨!!”)从一台机器传递到另一台机器的最简单方法是什么?我知道 IPC 的方法有很多,但最简单且开销最小的方法是什么?
Boost MPI 在我的场景中有用吗?我正在使用 C++ 来实现。
问题描述:有两个进程在网络中的两台不同的 Unix 机器上运行。将简单消息(例如“嗨!!”)从一台机器传递到另一台机器的最简单方法是什么?我知道 IPC 的方法有很多,但最简单且开销最小的方法是什么?
Boost MPI 在我的场景中有用吗?我正在使用 C++ 来实现。
使用套接字(我建议提升套接字)或查看ZeroMQ。ZeroMQ 实际上可能更容易,因为它保证始终接收完整的消息。
这足够简单吗?(使用纯 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
)。