【发布时间】: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