在尝试学校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++;
}
}
谢谢。
答案 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)
我不知道为什么首先会出现循环,但我希望您的问题已解决。