【问题标题】:MPI Ring Communication deadlockMPI环通信死锁
【发布时间】:2019-05-29 00:16:40
【问题描述】:

在为一个学校 mpi 项目做实验时写了这个,想知道为什么它不起作用: 我想要做的只是将所有点传递给下一个进程(具有等级 processId+1 的进程)并接收来自前一个进程的点。然后做同样的事情,从前一个迭代中的发送到接收并发送到下一个迭代(processId+2 等等)。 虽然它可以整齐地执行 2 个进程,但当我使用 4,8,.. 进程运行它时,它会在第一次迭代后死锁。

if(processId!=noProcesses-1)
    sending_to=processId+1;
else
    sending_to=0;

if(processId!=0)
    receiving_from=processId-1;
else
    receiving_from=noProcesses-1;

for(l=1;l<noProcesses;l++)
// ring communication with non-blocking methods
{
    printf("PROCESS %d: Iteration %d: sending_to=%d/receiving_from=%d\n",processId,l,sending_to,receiving_from);

    MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
    MPI_Request_free(&req);

    MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

    receiving_from=sending_to;

    if(sending_to==noProcesses-1) {
        sending_to=0;
    } else {
        sending_to++;
    }
}

提前致谢。

【问题讨论】:

    标签: c mpi communication ring


    【解决方案1】:

    您正在创建一个新的发送消息,在它完成之前释放它,然后调用接收:

    MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
    MPI_Request_free(&req);
    
    MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    

    您应该在消息发送后释放请求:

    MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
    MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    MPI_Wait(&req);
    

    【讨论】:

    • MPI_Recv() 之后只需MPI_Wait(&amp;req)MPI_Barrier() 太过分了,甚至不保证消息会被发送。 MPI_Request_free() 这里不需要。
    • 确实如此。改变答案。
    【解决方案2】:

    对不起,伙计们,后来不得不发布它以发现问题所在。 从第二次迭代开始,receiveing_from 和 sent_to 中的进程 ID 就混淆了。

    【讨论】:

      【解决方案3】:

      我不知道为什么会有一个循环,但我希望你的问题得到解决。

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 2013-12-25
        • 2017-07-02
        • 1970-01-01
        • 2020-03-25
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        相关资源
        最近更新 更多