C语言 MPI 环形通信死锁



在为学校 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=%dn",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++;
    }
}

提前谢谢。

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

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

不起,伙计们,不得不发布它以发现之后的错误所在。自第二次迭代以来,receiving_from和sending_to中的进程 ID 会混淆。

我不知道

为什么首先有一个循环,但我希望你的问题得到解决。

最新更新