繁体   English   中英

在MPI中,套接字编程的select()相当于什么?

[英]What is equivalent of socket programming's select() in MPI?

在套接字编程中,我们有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_Waitsome ,您提供一个请求列表,并在完成至少一个请求后立即返回。 但是, select没有超时。 还有MPI_WaitanyMPI_Waitall以及MPI_TestanyMPI_TestallMPI_Testsome

anysome变体的主要区别在于接口通知您一个或多个已完成的请求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM