[petsc-dev] PetscCommGetThreadComm() is currently collective
Jed Brown
jedbrown at mcs.anl.gov
Sat Oct 20 17:02:33 CDT 2012
On Sat, Oct 20, 2012 at 4:54 PM, Shri <abhyshr at mcs.anl.gov> wrote:
> On Oct 20, 2012, at 3:58 PM, Jed Brown wrote:
>
> > Worse, validity of the cache changes whether it has a barrier (in debug
> mode) or not.
>
> I don't understand the point you are making here.
There is a barrier in PetscCommDuplicate, but we cache the thread comm
because it involves several lookups and had a nontrivial performance
effect. Thus
Rank 0
PetscCommGetThreadComm(WORLD)
PetscCommGetThreadComm(SELF) // tcomm cache miss, okay because comm is
sequential
PetscCommGetThreadComm(WORLD) // tcomm cache miss, triggers an
MPI_Barrier(WORLD)
Rank 1
PetscCommGetThreadComm(WORLD)
PetscCommGetThreadComm(WORLD) // tcomm cache HIT, no matching barrier
I'm going to commit the patch below unless there is an objection.
# HG changeset patch
# User Jed Brown <jed at 59A2.org>
# Date 1350767578 18000
# Node ID 376bb5351f20762cfd2309cbede0c349a2b34a6e
# Parent 538a44f2a56cf3a419067269fb5f2e2ce7c2a70d
Attach ThreadComm to outer comm instead of inner comm
diff --git a/src/sys/threadcomm/interface/threadcomm.c
b/src/sys/threadcomm/interface/threadcomm.c
--- a/src/sys/threadcomm/interface/threadcomm.c
+++ b/src/sys/threadcomm/interface/threadcomm.c
@@ -77,18 +77,15 @@
PetscErrorCode ierr;
PetscMPIInt flg;
void* ptr;
- MPI_Comm icomm;
PetscFunctionBegin;
if (comm == comm_cached) {
*tcommp = tcomm_cached;
PetscFunctionReturn(0);
}
- ierr = PetscCommDuplicate(comm,&icomm,PETSC_NULL);CHKERRQ(ierr);
- ierr =
MPI_Attr_get(icomm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
+ ierr =
MPI_Attr_get(comm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"MPI_Comm does
not have a thread communicator");
*tcommp = (PetscThreadComm)ptr;
- ierr = PetscCommDestroy(&icomm);CHKERRQ(ierr);
comm_cached = comm;
tcomm_cached = *tcommp;
PetscFunctionReturn(0);
@@ -1154,20 +1151,14 @@
PetscErrorCode PetscThreadCommDetach(MPI_Comm comm)
{
PetscErrorCode ierr;
- MPI_Comm icomm;
PetscMPIInt flg;
void *ptr;
PetscFunctionBegin;
- ierr = PetscCommDuplicate(comm,&icomm,PETSC_NULL);CHKERRQ(ierr);
- ierr =
MPI_Attr_get(icomm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
+ ierr =
MPI_Attr_get(comm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
if (flg) {
- ierr = MPI_Attr_delete(icomm,Petsc_ThreadComm_keyval);CHKERRQ(ierr);
+ ierr = MPI_Attr_delete(comm,Petsc_ThreadComm_keyval);CHKERRQ(ierr);
}
- ierr = PetscCommDestroy(&icomm);CHKERRQ(ierr);
- /* Release reference from PetscThreadCommAttach */
- ierr = PetscCommDestroy(&comm);CHKERRQ(ierr);
-
PetscFunctionReturn(0);
}
@@ -1180,16 +1171,14 @@
PetscErrorCode PetscThreadCommAttach(MPI_Comm comm,PetscThreadComm tcomm)
{
PetscErrorCode ierr;
- MPI_Comm icomm;
PetscMPIInt flg;
void *ptr;
PetscFunctionBegin;
- ierr = PetscCommDuplicate(comm,&icomm,PETSC_NULL);CHKERRQ(ierr); /* This
extra reference is released in PetscThreadCommDetach */
- ierr =
MPI_Attr_get(icomm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
+ ierr =
MPI_Attr_get(comm,Petsc_ThreadComm_keyval,&ptr,&flg);CHKERRQ(ierr);
if (!flg) {
tcomm->refct++;
- ierr = MPI_Attr_put(icomm,Petsc_ThreadComm_keyval,tcomm);CHKERRQ(ierr);
+ ierr = MPI_Attr_put(comm,Petsc_ThreadComm_keyval,tcomm);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20121020/cfa53e5e/attachment.html>
More information about the petsc-dev
mailing list