[petsc-dev] threadcomm memory leak
Barry Smith
bsmith at mcs.anl.gov
Mon Jul 16 22:44:20 CDT 2012
On Jul 16, 2012, at 9:51 PM, Jed Brown wrote:
> On Mon, Jul 16, 2012 at 6:53 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
> Yes, that is absolutely a hack and does not belong there. But you are totally miss understanding what I am saying: that hack is NEW. For 15 years PETSc did NOT need a hack to work with MPIUNI (which has a single communicator), thus I conclude that MPUNI is fine and something is wrong with the PETSc thread comm stuff if it requires that hack. That is, why the heck does petscthreadcomm depend on MPI_COMM_SELF != MPI_COMM_WORLD while for 20 years NOTHING ELSE IN PETSc (which is a dang lot more complicated than petscthreadcomm) does not depend on MPI_COMM_SELF != MPI_COMM_WORLD???
>
> As far as I know, the other calls to MPI_Attr_put occur the first time the comm is used with an object rather than being pre-initialized. In this case, PETSC_COMM_SELF and PETSC_COMM_WORLD are pre-endowed with the threadcomm. Should the threadcomm be placed in some global variable and obtained (and referenced) the first time it is used with a given communicator? If we store the canonical one on a comm, then it must be on COMM_WORLD and COMM_SELF.
/* PETSC_COMM_SELF = PETSC_COMM_WORLD for MPIUNI */
#if !defined(PETSC_HAVE_MPIUNI)
ierr = PetscCommDuplicate(PETSC_COMM_WORLD,&icomm,PETSC_NULL);CHKERRQ(ierr);
ierr = MPI_Attr_put(icomm,Petsc_ThreadComm_keyval,(void*)tcomm);CHKERRQ(ierr);
tcomm->refct++; /* Share the threadcomm with PETSC_COMM_SELF */
#endif
ierr = PetscCommDuplicate(PETSC_COMM_SELF,&icomm,PETSC_NULL);CHKERRQ(ierr);
ierr = MPI_Attr_put(icomm,Petsc_ThreadComm_keyval,(void*)tcomm);CHKERRQ(ierr);
I would not do it this way. Instead I would write a general routine that attached a threadcomm to a MPI_Comm; this routine would get the threadcomm_keyval and if it did NOT find it then would be put the attribute, otherwise it would know one was already there. Say it is called PetscThreadCommAttach(MPI_Comm, threadcomm); then in this routine you would just write
PetscThreadCommAttach(PETSC_COMM_WORLD, tcomm);
PetscThreadCommAttach(PETSC_COMM_SELF,tcomm); /* won't attr it again for MPIUni because it is already there */
>
>
> In other words fix petscthreadcomm model; don't mess with a perfectly good mpiuni.
>
> MPI has them as separate communicators. MPIUNI breaks that model for, as far as I can tell, no good reason.
1 Philosophical reason) The natural limitation of MPI to one process is to have a single communicator; having two different ones that are "identical" is unnatural
2 Practical reason) MPIUNI would be more complicated to handle two sets of attributes etc. Plus if you do this you really need to support MPI_Comm_dup as creating yet another "different" communicator making the code even more complicated since now you need to manage duping and freeing comms, becomes more like a real MPI implement. Not worth it.
3 It finds bugs in the design of new components like PetscThreadComm that make assumptions and puts an attribute without first checking if it is already there :-).
Barry
More information about the petsc-dev
mailing list