enhancement of cmpxchg and copy_to_survivor for ppc64
Andrew Haley
aph at redhat.com
Mon Apr 18 16:45:00 UTC 2016
On 04/18/2016 05:23 PM, Volker Simonis wrote:
> We've looked at the proposed changes and we are pretty sure that the
> cmpxchg done during copy_to_survivor_space in the parallel GC doesn't
> require the full fence/acquire semantics. But we also agree that this
> should not be ifdefed PPC64 in shared code.
>
> Andrews suggestion of using the new C++11 atomic memory operators is
> good, although in practice it may be hard to get all the different
> compilers under the hood.
What do you mean?
> But now that we've even got the corresponding cmpxchg routines with
> various acquire/release semantics in Java-land in the new
> jdk.internal.Unsafe package, it would be a pity if it would not be
> possible to use that functionality within the Hotspot.
>
> I think one approach to enable an easy transition would be to do the
> proposed enhancements (or something similar) to cmpxchg
> unconditionally in atomic.hpp. For example instead of two extra
> boolean parameters we could use an enum similar to the one in
> library_call.cpp:
>
> typedef enum { Relaxed, Opaque, Volatile, Acquire, Release } AccessKind;
Note that cmpxchg has two args: memory order succeed, and memory
order fail.
> The default value of this parameter should of course be conservative
> (i.e. Volatile) so we don't change the current behavior. After that
> individual, performance critical callers of these routines can be
> examined if they really require the most conservative setting and
> maybe optimized.
>
> What do you think?
OK, but I think we should use the standard C++ types from std::memory_order
because HotSpot is a C++ program. These are:
typedef enum memory_order
{
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
} memory_order;
I'm not suggesting they should have exactly these names, but it's a really
good idea to insist they have the same semantics. So:
{ Relaxed, Consume, Acquire, Release, AquireRelease, SeqCst }
I know that there is a (fairly) serious attempt to define the semantics of
Unsafe memory order so that it's compatible with C++.
I'm not sure if Opaque is useful at this level: as far as I can tell
from the opaque (:-) documentation it's like a C++ volatile read.
I'm sure we're going to need memory_order_consume sooner or later:
HotSpot already assumes consume-like behaviour for memory accesses
which have address dependencies. It would be nice to make such
accesses explicit.
Andrew.
More information about the hotspot-runtime-dev
mailing list