【发布时间】:2013-03-28 09:35:51
【问题描述】:
我正在尝试检测 MPI 中的死锁
有什么方法可以让我们在特定时间后从像 MPI_Recv 这样的函数跳转。
【问题讨论】:
我正在尝试检测 MPI 中的死锁
有什么方法可以让我们在特定时间后从像 MPI_Recv 这样的函数跳转。
【问题讨论】:
MPI_Recv 是一个阻塞函数,它会一直坐在那里,直到它接收到它正在等待的数据,所以如果你想让它超时并在事情锁定时出错,那么我认为这不适合你。
您可以考虑使用MPI_Irecv,这是非阻塞版本。然后,您可以使用MPI_Wait 或MPI_Test 模拟MPI_Recv 的阻塞行为。
如果您使用MPI_Irecv 和MPI_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
}
【讨论】: