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

qjp7pelc  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(170)

我想通过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!有什么问题吗?

qvtsj1bj

qvtsj1bj1#

您必须发送从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对象。

af7jpaap

af7jpaap2#

据我所知,您将从string对象的开头发送1个字符,即1个字节。你得把所有东西都寄过来。
当发送对象时,您需要小心对象内部的指针,您可能发送的是指针地址,但不是内容本身。如果string对象在堆中存储实际的char数组,则可能会出现这种情况。
在这种情况下,我宁愿发送c_str()而不是对象本身,大小将是c_str()的长度加上1,以在末尾包含空字符。然后,您可以在接收到string对象后,从字符数组中重建该对象。

EDIT修改字符串发送:

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

那应该能用

klh5stk1

klh5stk13#

我知道这是一个很老的问题,但我想分享我的经验,以防其他人碰到这个问题。
看来赫里斯托的回答已经过时了。为了使它在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;
abithluo

abithluo4#

@sondrelv的答案是正确的,但它抛出了“ISO C++禁止可变大小数组”的警告。此代码修复了new ing和delete ing缓冲区的警告。

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

// Receiver
MPI_Status status;
MPI_Probe(source, tag, MPI_COMM_WORLD, &status);
int count;
MPI_Get_count(&status, MPI_CHAR, &count);
char *buf = new char[count];
MPI_Recv(buf, count, MPI_CHAR, source, tag, MPI_COMM_WORLD, &status);
str = buf;
delete[] buf;

相关问题