David,

is this code representative for what your app is doing? E.g. you have a base communicator (e.g. MPI_COMM_WORLD) which is being 'split', freed again, split, freed again etc. ? i.e. the important aspect is that the same 'base' communicator is being used for deriving new communicators again and again?

The reason I ask is two-fold: one, you would in that case be one of the ideal beneficiaries of the block cid algorithm :-) (even if it fails you right now); two, a fix for this scenario which basically tries to reuse the last block used (and which would fix your case if the condition is true) is roughly five lines of code. This would give us the possibility to have a fix quickly in the trunk and v1.3 (keep in mind that the block-cid code is in the trunk since two years and this is the first problem that we have) and give us more time to develop a profound solution for the worst case - a chain of communicators being created, e.g. communicator 1 is basis to derive a new comm 2, comm 2 is being used to derive comm 3 etc.

Thanks
Edgar

David Gunter wrote:
Here is the test code reproducer:

      program test2
      implicit none
      include 'mpif.h'
      integer ierr, myid, numprocs,i1,i2,n,local_comm,
     $     icolor,ikey,rank,root

c
c...  MPI set-up
      ierr = 0
      call MPI_INIT(IERR)
      ierr = 1
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
      print *, ierr

      ierr = -1

      CALL MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)

      ierr = -5
      i1 = ierr
      if (myid.eq.0) i1 = 1
      call mpi_allreduce(i1, i2, 1,MPI_integer,MPI_MIN,
     $     MPI_COMM_WORLD,ierr)

      ikey = myid
      if (mod(myid,2).eq.0) then
         icolor = 0
      else
         icolor = MPI_UNDEFINED
      end if

      root = 0
      do n = 1, 100000

         call MPI_COMM_SPLIT(MPI_COMM_WORLD, icolor,
     $        ikey, local_comm, ierr)

         if (mod(myid,2).eq.0) then
            CALL MPI_COMM_RANK(local_comm, rank, ierr)
            i2 = i1
            call mpi_reduce(i1, i2, 1,MPI_integer,MPI_MIN,
     $           root, local_comm,ierr)

            if (myid.eq.0.and.mod(n,10).eq.0)
     $           print *, n, i1, i2,icolor,ikey

            call mpi_comm_free(local_comm, ierr)
         end if

      end do
c      if (icolor.eq.0) call mpi_comm_free(local_comm, ierr)



      call MPI_barrier(MPi_COMM_WORLD,ierr)

      call MPI_FINALIZE(IERR)

      print *, myid, ierr

      end



-david
--
David Gunter
HPC-3: Parallel Tools Team
Los Alamos National Laboratory



On Apr 30, 2009, at 12:43 PM, David Gunter wrote:

Just to throw out more info on this, the test code runs fine on previous versions of OMPI. It only hangs on the 1.3 line when the cid reaches 65536.

-david
--
David Gunter
HPC-3: Parallel Tools Team
Los Alamos National Laboratory



On Apr 30, 2009, at 12:28 PM, Edgar Gabriel wrote:

cid's are in fact not recycled in the block algorithm. The problem is that comm_free is not collective, so you can not make any assumptions whether other procs have also released that communicator.


But nevertheless, a cid in the communicator structure is a uint32_t, so it should not hit the 16k limit there yet. this is not new, so if there is a discrepancy between what the comm structure assumes that a cid is and what the pml assumes, than this was in the code since the very first days of Open MPI...

Thanks
Edgar

Brian W. Barrett wrote:
On Thu, 30 Apr 2009, Ralph Castain wrote:
We seem to have hit a problem here - it looks like we are seeing a
built-in limit on the number of communicators one can create in a
program. The program basically does a loop, calling MPI_Comm_split each
time through the loop to create a sub-communicator, does a reduce
operation on the members of the sub-communicator, and then calls
MPI_Comm_free to release it (this is a minimized reproducer for the real
code). After 64k times through the loop, the program fails.

This looks remarkably like a 16-bit index that hits a max value and then
blocks.

I have looked at the communicator code, but I don't immediately see such a field. Is anyone aware of some other place where we would have a limit
that would cause this problem?
There's a maximum of 32768 communicator ids when using OB1 (each PML can set the max contextid, although the communicator code is the part that actually assigns a cid). Assuming that comm_free is actually properly called, there should be plenty of cids available for that pattern. However, I'm not sure I understand the block algorithm someone added to cid allocation - I'd have to guess that there's something funny with that routine and cids aren't being recycled properly.
Brian
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

--
Edgar Gabriel
Assistant Professor
Parallel Software Technologies Lab      http://pstl.cs.uh.edu
Department of Computer Science          University of Houston
Philip G. Hoffman Hall, Room 524        Houston, TX-77204, USA
Tel: +1 (713) 743-3857                  Fax: +1 (713) 743-3335
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

--
Edgar Gabriel
Assistant Professor
Parallel Software Technologies Lab      http://pstl.cs.uh.edu
Department of Computer Science          University of Houston
Philip G. Hoffman Hall, Room 524        Houston, TX-77204, USA
Tel: +1 (713) 743-3857                  Fax: +1 (713) 743-3335

Reply via email to