【发布时间】:2016-05-25 06:27:42
【问题描述】:
在套接字编程中,我们有select() 函数,它允许我们同时检查多个套接字。我想知道 MPI 库中是否也有这样的功能?
在以下代码的第一个 for 循环中,我从一个节点向每个其他节点发送多个非阻塞发送和接收请求。在第二个 for 循环中,我不想按顺序等待每个节点,而是要开始处理首先发送其数据的节点的数据。我想知道有没有办法做到这一点?
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
}
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(recvCount[id] != 0){
MPI_Wait(&reqs[id], &status);
for(i=0; i<recvCount[id]; i++)
splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]);
}
}
根据给定的答案,我尝试修改我的代码,但在运行时仍然出现分段错误错误。请帮我找出错误。
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
}
reqs[taskid] = reqs[numtasks-1];
for(i=0; i<numtasks-1; i++){
MPI_Waitany(numtasks-1, reqs, &id, &status);
if(id == taskid) id = numtasks-1;
for(i=0; i<recvCount[id]; i++)
splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]);
}
【问题讨论】:
-
例如使用
MPI_Waitany()怎么样? -
@Gilles 请检查我编辑的问题
-
抱歉,您的代码 sn-p 不够清晰,我无法更具体。我可以说的是,对发送和接收使用相同的请求是灾难的根源。你可能应该在使用它之后将
reqs[id]设置为MPI_REQUEST_NULL,并在你的MPI_Waitany()循环中使用它之前检查id是否是MPI_UNDEFINED... -
@Gilles 非常感谢!它现在运行良好。
标签: c++ parallel-processing mpi distributed distributed-computing