如何在MPI出现死锁的特定时间后停止(或终止)MPI_Recv?

时间:2013-04-05 20:27:49

标签: linux gcc mpi

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

是否有任何方法可以在特定时间后从MPI_Recv这样的函数跳转。

1 个答案:

答案 0 :(得分:2)

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

您可以查看使用MPI_Irecv,这是非阻止版本。然后,您可以使用MPI_WaitMPI_Test模拟MPI_Recv的屏蔽行为。

如果您使用MPI_IrecvMPI_Test的组合,您可以制作一个等待接收指定时间长度的片段,如果没有,则会出现错误。粗略的例子:

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
}