Howdy,
here's a creative way to deadlock a program: create and destroy 65500 and 
some communicators and send a message on each of them:
----------------------------------------
#include <mpi.h>

#define CHECK(a)                                \
  {                                             \
    int err = (a);                              \
    if (err != 0) std::cout << "Error in line " << __LINE__ << std::endl; \
  }

int main (int argc, char *argv[])
{
  int a=0, b;

  MPI_Init (&argc, &argv);

  for (int i=0; i<1000000; ++i)
    {
      if (i % 100 == 0) std::cout<< "Duplication event " << i << std::endl;

      MPI_Comm dup;
      CHECK(MPI_Comm_dup (MPI_COMM_WORLD, &dup));
      CHECK(MPI_Allreduce(&a, &b, 1, MPI_INT, MPI_MIN, dup));
      CHECK(MPI_Comm_free (&dup));
    }

  MPI_Finalize();
}
-------------------------------------------
If you run this, for example, on two processors with OpenMPI 1.2.6 or 
1.3.2, you'll see that the program runs until after it produces 65500 as 
output, and then just hangs -- on my system somewhere in the operating 
system poll(), running full steam.

Since I take care of destroying the communicators again, I would have 
expected this to work. I use creating many communicators basically as a 
debugging tool: every object gets its own communicator to work on to 
ensure that different objects don't communicate by accident with each 
other just because they all use MPI_COMM_WORLD. It would be nice if this 
mode of using MPI could be made to work.

Best & thanks in advance!
 Wolfgang

-- 
-------------------------------------------------------------------------
Wolfgang Bangerth                email:            bange...@math.tamu.edu
                                 www: http://www.math.tamu.edu/~bangerth/

Reply via email to