【问题标题】:What is equivalent of socket programming's select() in MPI?什么相当于 MPI 中套接字编程的 select()?
【发布时间】: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


【解决方案1】:

最接近的等价物是MPI_Waitsome,您提供一个请求列表,它会在至少一个请求完成后立即返回。但是,没有像 select 那样的超时。还有MPI_WaitanyMPI_Waitall以及MPI_TestanyMPI_TestallMPI_Testsome

anysome 变体的主要区别在于界面通知您一个或多个已完成请求的方式。

编辑:您需要为每个操作使用单独的请求,特别是发送和接收操作。

【讨论】:

  • 我在原始问题中没有看到(因为我没有向右滚动),您必须使用单独的请求进行发送和接收。如果您仍然失败,请提供minimal reproducible example
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 2014-03-27
  • 2017-12-03
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多