如何检查所有MPI过程是否都用于调用过程?

时间:2014-09-03 20:03:00

标签: mpi

我设计了一个程序,必须由通信器中的所有处理器调用才能正常运行。如果用户只使用根级别调用它,我希望程序知道这一点,然后向该过程的用户产生有意义的错误消息。起初我想过程序调用下面显示的检查程序:

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用于执行调用,则其他过程将永远不会到达。有没有办法做我想做的事情?

2 个答案:

答案 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 */
}