On Mon, Jul 16, 2012 at 10:44 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
> /* 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 */ > This looks good, but there is also a ref-counting check needed in PetscThreadCommDetach/Destroy because the thread pool (presumably) needs to be closed before PetscFinalize returns. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20120716/0f68a3a9/attachment.html>
