如何在MPI中发送std :: string?

时间:2014-01-27 10:23:00

标签: c++ string mpi

我想通过MPI发送字符串变量,但我不知道该怎么做! 我的代码在这里:

static string  fourTupX="Hello";

现在我想通过MPI发送它:

int l=std::strlen(fourTupX.c_str());
l++;
MPI::COMM_WORLD.Send (&l,1,MPI::INT,1,7);
MPI::COMM_WORLD.Send ( &fourTupX, 1, MPI::CHAR, 1, 1 );

并在另一方接收:

int l;
 source=0;
 MPI::COMM_WORLD.Recv (&l,1,MPI::INT , source, 7, status1 );
 cout<<l;
 char* myfourTupX=new char[l];
 MPI::COMM_WORLD.Recv (myfourTupX,l,MPI_CHAR , source, 1, status1 );

但收到后在fourTupx中没有任何东西! 有什么问题?

3 个答案:

答案 0 :(得分:9)

您必须发送从c_str()获取的字符串缓冲区的内容。您不必首先发送字符串长度,因为接收方可以先调用消息,然后分配适当大小的缓冲区:

// Sender

string bla = "blabla";
MPI::COMM_WORLD.Send(bla.c_str(), bla.length(), MPI::CHAR, dest, 1);

// Receiver

MPI::Status status;
MPI::COMM_WORLD.Probe(source, 1, status);
int l = status.Get_count(MPI::CHAR);
char *buf = new char[l];
MPI::COMM_WORLD.Recv(buf, l, MPI::CHAR, source, 1, status);
string bla1(buf, l);
delete [] buf;

接收器使用Probe来探测匹配的消息,并检查status对象以找出消息中有多少个字符。然后它分配一个相同大小的缓冲区,接收消息并构造一个std::string对象。

答案 1 :(得分:2)

据我所知,您从string对象的开头发送1个字符,即1个字节。你需要发送整件事。

发送对象时,需要注意对象内部的指针,可能是发送指针地址,而不是内容本身。如果string对象将实际的char数组存储在堆中,则可能就是这种情况。

在这种情况下,我宁愿发送c_str()而不是对象本身,并且大小将是c_str()加上1的长度,以在末尾包含空字符。然后,您可以在收到后从字符数组重建string对象。

修改 修改你的字符串send:

MPI::COMM_WORLD.Send ( fourTupX.c_str(), l, MPI::CHAR, 1, 1 ); //it's l, not 1

然后它应该工作。

答案 2 :(得分:1)

我知道这是一个非常古老的问题,但我想分享我的经验,以防其他任何人碰到这个问题。

看来Hristo的答案已经过时了。为了使其适用于较新版本的MPI,我建议您使用

// Sender
std::string s = "somestring";
MPI_Send(&s[0],s.size()+1,MPI_CHAR,<destination>,<tag>,MPI_COMM_WORLD);

// Receiver
MPI_Status status;
MPI_Probe(<sender>,<tag>,MPI_COMM_WORLD,&status);
int count;
MPI_Get_count(&status,MPI_CHAR,&count);
char buf [count];
MPI_Recv(&buf,count,MPI_CHAR,<sender>,<tag>,MPI_COMM_WORLD,&status);
std::string s = buf;