[petsc-dev] de-global variablelizing PETSc
Dmitry Karpeyev
karpeev at mcs.anl.gov
Sun Nov 10 15:38:23 CST 2013
On Nov 10, 2013 10:40 AM, "Jed Brown" <jedbrown at mcs.anl.gov> wrote:
>
> Barry Smith <bsmith at mcs.anl.gov> writes:
> > 1) Hmm, the check for “initialized” of something is done often and
> > through out the run of the code. Will each thread through out the
> > run of the code need to check the lock each time?
>
> No, the "initialized" variable only ever changes in one direction. The
> user should not have to call XXFinalizePackage() and if they really
> must, _all_ variables would have to be thread local (or make the PETSc
> library instance an object and pass it explicitly to every constructor
> [1]).
>
> > 2) Can the lock be made 100% portable and independent of the
> > threading model etc that user is using?
>
> Independent of the threading model, but somewhat dependent on the
> compiler and/or architecture. For example, C11 stdatomic.h is not
> widely available yet, and third-party implementations (like
> http://concurrencykit.org/) require inline assembly, which Cray's
> compiler suite does not support. GCC has supported atomics for a long
> time and many vendors offer that syntax.
>
> http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/C-Extensions.html#C-Extensions
>
> > 3) Philosophy - why use a lock when it isn’t truly needed?
>
> MPI will be using a lock regardless if you use threads. And the kernel
> uses locks all over the place (and more sophisticated techniques like
> RCU). Locks are an important tool and one that I think is important.
>
>
> [1] This is the real way to support arbitrary threading models and
> usage. It would cause a huge (mostly-cosmetic) impact on user code,
> but the idea would be that PetscInitialize() would return a "Petsc"
> library context and _every_ constructor or function that currently
> has global state would take this thing as its first argument. Users
> that want separate instances of the library in separate threads
> would MPI_Init_thread() and pass their communicator to
> PetscInitialize() (could call it PetscInitializeThread, but it would
> take an explicit MPI_Comm parameter, though you could pass
> MPI_COMM_NULL; the static variable PETSC_COMM_WORLD would have to
> go, perhaps replaced by PetscCommWorld(petsclib)).
What would happen to VecCreate(PETSC_COMM_WORLD,&v)?
Would v now be a collection of threadwise Vecs?
How would they sync?
Dmitry.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20131110/4dbd9c6b/attachment.html>
More information about the petsc-dev
mailing list