我设计了一个程序,必须由通信器中的所有处理器调用才能正常运行。如果用户只使用根级别调用它,我希望程序知道这一点,然后向该过程的用户产生有意义的错误消息。起初我想过程序调用下面显示的检查程序:
subroutine AllProcsPresent
! Checks that all procs have been used to call this procedure
use MPI_stub, only: nproc, Allreduce
integer :: counter
counter=1
call Allreduce(counter) ! This is a stub procedure that will add "counter" across all procs
if (counter(1)==get_nproc()) then
return
else
print *, "meaningful error"
end if
end subroutine AllProcsPresent
但这不会起作用,因为Allreduce将等待所有过程检查,如果只有root用于执行调用,则其他过程将永远不会到达。有没有办法做我想做的事情?
答案 0 :(得分:0)
你在这里做的不多。你可能想看看collecheck'对于想法,但很难为该包找到一个好的资源。这是他们的家:
http://git.mpich.org/mpe.git/tree/HEAD:/src/collchk
如果你看看'注意'有关于"呼叫一致性的项目"描述为"确保通信器中的所有进程在给定事件中进行了相同的调用"。希望能给你一些想法。
答案 1 :(得分:0)
确保沟通者中所有职级都进入集体行动是程序员的责任。
但是,您可以考虑使用带有MPI_Ibarrier
循环和超时的MPI 3.0非阻塞集合MPI_Test
。但是,非阻塞集体不能取消,因此如果其他级别在您的超时内没有加入操作,您将不得不中止整个工作。类似的东西:
void AllPresent(MPI_Comm comm, double timeout) {
int all_here = 0;
MPI_Request req;
MPI_Ibarrier(comm, &req);
double start_time = MPI_Wtime();
do {
MPI_Test(&req, &all_here, MPI_STATUS_IGNORE);
sleep(0.01);
double now = MPI_Wtime();
if (now - start_time > timeout) {
/* Print an error message */
MPI_Abort(comm, 1);
}
} while (!all_here);
/* Run your procedure now */
}