尝试使用MPI_Send和MPI_Recv发送char数组时获得垃圾数据

6

我正在尝试从每个处理器创建日志文件,然后将其作为字符数组发送到根节点。我首先发送长度,然后发送数据。长度可以正常发送,但是数据总是垃圾!以下是我的代码:

MPI_Barrier (MPI_COMM_WORLD);
string out = "";

MPI_Status status[2];
MPI_Request reqs[num_procs];

string log = "TEST";
int length = log.length();
char* temp = (char *) malloc(length+1);
strcpy(temp, log.c_str());

if (my_id != 0)
{
    MPI_Send (&length, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
    MPI_Send (&temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);
}   
else {      
    int length;
    for (int i = 1; i < num_procs; i++)
    {
        MPI_Recv (&length, 2, MPI_INT, i, 1, MPI_COMM_WORLD, &status[0]);
        char* rec_buf;
        rec_buf = (char *) malloc(length+1);
        MPI_Recv (rec_buf, length+1, MPI_CHAR, i, 1, MPI_COMM_WORLD, &status[1]);
        out += rec_buf;
        free(rec_buf);
    }
}

MPI_Barrier (MPI_COMM_WORLD);
free(temp);

3
你可以添加一份回答,但需要等待一定的时间。如果你现在返回并添加回答,它不会显示为未解决,你需要再等待一段时间后才能将其标记为已回答。 - Wesley Bland
请在下面添加您的答案。 - Mr_and_Mrs_D
为什么你在使用 MPI_Send (&length, 1, ...) 发送一个单词,但是在接收时却使用了 MPI_Recv (&length, 2, ...) 接收两个单词? - Always Asking
另外,为什么你所有的消息标签都是1?引用自消息传递接口(MPI):“发送和接收操作应该匹配消息标签。” - Always Asking
1个回答

5
您正在向 MPI_Send 传递一个 char** 而不是 char*,这会导致内存损坏,或者在您的情况下导致输出混乱。如果您使用以下代码,则一切都应该正常:
MPI_Send (temp, length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD);

注意第一个参数temp前面被移除的&符号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接