如何使用MPI发送和接收字符串

时间:2013-12-16 20:38:44

标签: c++ c mpi

我正在尝试使用MPI发送和接收字符串,但结果是无跳的。

发送功能:

MPI_Send(&result, result.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);

recv功能:

    MPI_Recv(&result,      /* message buffer */
        128,                 /* one data item */
        MPI_CHAR,        /* of type char real */
        MPI_ANY_SOURCE,    /* receive from any sender */
        MPI_ANY_TAG,       /* any type of message */
        MPI_COMM_WORLD,    /* default communicator */
        &status);          /* info about the received message */

结果是字符串。

我没有收到任何错误,但程序不想完成。

2 个答案:

答案 0 :(得分:13)

std::string的地址与底层C字符串的地址不同,因此发送应该像这样修复:

MPI_Send(result.c_str(), result.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);

当您尝试接收时无法进行接收。您需要一个缓冲区(char数组),您将传递给MPI_Recv并稍后使用它来创建std::string实例。要获得接收到的字符串的长度,请使用MPI_Get_count - 这应该将指针传递给缓冲区std::string构造函数。

为了避免预先分配缓冲区并允许它接收任何大小的字符串,您应该调用MPI_ProbeMPI_Get_count来获取长度。知道了长度,您可以使用必要的确切大小来分配缓冲区,然后再调用MPI_Recv

如果这听起来有点复杂,那么您可以考虑使用BOOST MPI wrappers

答案 1 :(得分:0)

我遇到了类似的问题,我不得不在MPI C的两个进程之间传递一个字符串。针对您的问题,我的解决方案是:

MPI_Send(&result, strlen(result)+1, MPI_CHAR, 1, 0, MPI_COMM_WORLD); // Destination: Process 1

另一方面,进程0将具有以下MPI_Recv函数:

MPI_Recv(&result, 100, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // Source: Process 0 and considering 100 as the maximum string length

<string.h>必须添加到标题中。