【问题标题】:How to send and receive string using MPI如何使用 MPI 发送和接收字符串
【发布时间】:2014-01-04 09:42:35
【问题描述】:

我正在尝试使用 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 */

其中 result 是一个字符串。

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

【问题讨论】:

    标签: c++ c mpi


    【解决方案1】:

    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,打败我。关于接收,如果知道result 有足够大的缓冲区(之前创建的),他可以使用&result[0] 来获取指向内部缓冲区的非常量指针。
    • 如果resultstd::string,那么&result[0] 应该与result.c_str() 相同,除了它是非常量。我个人会使用前者,const_cast。我明白你的意思了,传递一个预先分配的std::string 可以与MPI_Recv 一起工作,但是如果字符串包含0 就会失败,所以应该小心...
    • 当我将参数更改为 char 数组时,一切正常。谢谢各位。 :)
    • 你不应该使用 MPI_Send(result.c_str(), result.size() + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);为了合并字符串终止符号 '\0' ?
    • @piokuc MPI_Send(result.c_str(), result.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);给出编译器错误,告诉第一个类型为 const char* 的参数与参数 void* 不兼容。我该如何解决?
    【解决方案2】:

    我遇到了类似的问题,我必须在 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> 必须添加到标题中。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2013-01-28
      • 2013-04-15
      • 2018-03-12
      • 1970-01-01
      • 2013-12-20
      • 2016-06-15
      • 2012-03-13
      • 2019-10-25
      相关资源
      最近更新 更多