MPI环形通信死锁

时间:2019-01-02 10:38:18

标签: c mpi communication ring

在尝试学校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++;
    }
}

谢谢。

3 个答案:

答案 0 :(得分:0)

您正在创建新的发送消息,在完成发送消息之前将其释放,然后致电接收:

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);

答案 1 :(得分:0)

对不起,不得不将其发布以随后发现错误。 自第二次迭代以来,receive_from和sending_to中的进程ID混合在一起。

答案 2 :(得分:-1)

我不知道为什么首先会出现循环,但我希望您的问题已解决。