gpt4 book ai didi

c - MPI_Recv 和超时

转载 作者:行者123 更新时间:2023-11-30 17:55:20 25 4
gpt4 key购买 nike

我有一个问题。假设我有 np 个进程。对于每个进程,我根据输入文件计算需要发送到每个其他进程的消息数量(从 0 到...),并且我想向它们发送这个数字。问题是我只能从通过直接连接的节点创建的拓扑发送。所以基本上我希望每个进程向所有其他进程发送一个 int,我有以下算法(将使用伪代码):

for(i=1,np){
if(i!=rankID){
MPI_Send(&nr,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM_WORLD);
MPI_SEND(&i,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM,WORLD); //i send the destination along with the int
}
}
while(1){
MPI_Recv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
if(destination == rankID){
ireceive+=recvInt;
receivedFrom++;
//normally i would break if i received all np-1 messages but what if someone sends a message through me for another process ?
}
else{
MPI_Send(&recvInt,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
MPI_Send(&destination,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
}

}

现在对此进行更多解释。在这个小算法结束时,我希望每个进程都知道它们在下一步中将收到多少条消息。

要从每个节点向每个节点发送此消息,我使用之前创建的路由表。基本上每个节点都有一个包含所有节点的矩阵,并且拓扑[节点][1] = 下一跳(这就是我输入 nexthop 的原因)上面的代码)。

每个节点都知道有 np 个进程,因此每个节点必须接收 np-1 条消息(他是目的地)。

我遇到的问题是,在收到 np-1 消息后,我无法中断,因为我可能是其他进程的 next_hop 并且消息不会被发送。所以我想做这样的事情,使用 MPI_TEST 或其他指令来查看我的 Recv 是否实际上正在接收某些内容,或者它是否只是坐在那里,因为如果程序阻塞 1-2 秒,很明显它不会接收不再需要(因为我没有最多 20-30 个进程的大型拓扑)。

问题是我从未使用过 MPI_Test 或其他语法,我不确定如何执行此操作。有人可以帮助我为 Recv 创建超时,或者是否有其他解决方案?谢谢,抱歉文字很长

最佳答案

可能不是最有效的代码,但它应该可以工作(我没有机会测试它)

MPI_Request request;
MPI_Status status;
for(i=1,np){
if(i!=rankID){
MPI_ISend(&nr,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM_WORLD);
MPI_ISend(&i,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM,WORLD); //i send the destination along with the int
}
}
while(1){
bool over = false;
if(over == true)
break;
if(recievedFrom < np){
MPI_Recv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
if(destination == rankID){
ireceive+=recvInt;
receivedFrom++;
//normally i would break if i received all np-1 messages but what if someone sends a message through me for another process ?
}
else{
MPI_Send(&recvInt,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
MPI_Send(&destination,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
}
}
else {
MPI_Irecv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD, request); // non blocking recieve call after you finished receiving everything addressed to you
time_t now = time(NULL);
while(time(NULL) < now + time_you_set_until_timeout){
over = true;
int flag = 0;
MPI_Test(req, flag, status);
if(flag){
over = false;
break; //exit timeout loop if something was received
}
}
}
if(!over){
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
//route the message and continue
}
}

无论如何,由于您不知道消息通过您的拓扑需要多长时间,因此您应该小心选择超时时间。您可以尝试实现其他类型的信令机制,例如广播一条消息,告诉节点收到了发送给它的所有消息。当然,它会增加发送的消息数量,但它将确保每个人都收到一切。此外,您还可以尝试打包或序列化要发送的数据,这样您就只有一次 Send/Recv 调用,这将使您的代码更易于使用(在我看来)。

关于c - MPI_Recv 和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com