【问题标题】:how to stop(or terminate ) MPI_Recv after some perticular time when there is deadlock in MPI?当 MPI 出现死锁时,如何在特定时间后停止(或终止) MPI_Recv?
【发布时间】:2013-03-28 09:35:51
【问题描述】:

我正在尝试检测 MPI 中的死锁

有什么方法可以让我们在特定时间后从像 MPI_Recv 这样的函数跳转。

【问题讨论】:

    标签: linux gcc mpi


    【解决方案1】:

    MPI_Recv 是一个阻塞函数,它会一直坐在那里,直到它接收到它正在等待的数据,所以如果你想让它超时并在事情锁定时出错,那么我认为这不适合你。

    您可以考虑使用MPI_Irecv,这是非阻塞版本。然后,您可以使用MPI_WaitMPI_Test 模拟MPI_Recv 的阻塞行为。

    如果您使用MPI_IrecvMPI_Test 的组合,您可以创建一个等待接收指定时间长度的sn-p,如果没有则出错。粗略的例子:

    MPI_Irecv(..., &request); //start a receive request, non-blocking
    time_t start_time = time(); //get start time
    MPI_Test(&request, &gotData, ...); //test, have we got it yet
    
    //loop until we have received, or taken too long
    while (!gotData && difftime(time(),start_time) < TIMEOUT_TIME) {
      //wait a bit.
      MPI_Test(&request, &gotData, ...); //test again
    }
    
    //By now we either have received the data, or taken too long, so...
    if (!gotData) { 
      //we must have timed out
      MPI_Cancel(&request);
      MPI_Request_free(&request);
      //throw an error
    }
    

    【讨论】:

    • 应该正确取消不匹配的非阻塞接收。我已经相应地修改了你的答案。
    • 感谢@HristoIliev,我应该提到需要添加一些清理代码。
    猜你喜欢
    • 2012-04-04
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多