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




Reply via email to