Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am trying to send and recieve string using MPI but results are hopless.

Send function:

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

And the recv function:

    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 */

Where result is a string.

I didn't get any error but program doesn't want to finish.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
948 views
Welcome To Ask or Share your Answers For Others

1 Answer

The address of a std::string is not the same as address of the underlying C string, so sending should be fixed like this:

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

Receiving cannot be done as you tried to do it. You need a buffer (an array of char), which you will pass to MPI_Recv and use it later to create a std::string instance. To get a length of the string received use MPI_Get_count - this you should pass along the pointer to buffer to std::string constructor.

In order to avoid preallocating the buffer and allow it to receive a string of any size you should call MPI_Probe and MPI_Get_count to get the length first. Knowing the length you can allocate the buffer with the exact size which is necessary, and only then call MPI_Recv.

If this sounds a bit complicated then you can consider using BOOST MPI wrappers.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...