我正在尝试使用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 */
结果是字符串。
我没有收到任何错误,但程序不想完成。
答案 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_Probe
和MPI_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>
必须添加到标题中。