Memory Segment efficient array handling

leerho leerho at gmail.com
Thu Jun 17 17:56:37 UTC 2021


Maurizio,
Wow! Thanks!

You clearly put a lot of work into these changes!  You completely rewrote
the test class using tools that I was not aware of as well as
simplifications of the ultimate code.  I was pleased that at least the
basic concept of the tests survived.

I am very grateful for the time you spent on this!

Cheers,
Lee.



On Thu, Jun 17, 2021 at 8:44 AM Maurizio Cimadamore <
maurizio.cimadamore at oracle.com> wrote:

> I've finalized the PR, it is now a full PR which is ready for review. I
> did some passes over the code and fix some things here and there,
> hopefully nothing too controversial.
>
> Cheers
> Maurizio
>
> On 16/06/2021 16:56, Maurizio Cimadamore wrote:
> > Hi Lee,
> > I've updated the PR with your latest changes. Everything works fine -
> > there were some trailing whitespaces that I fixed, other than that the
> > test works ok.
> >
> > Maurizio
> >
> > On 15/06/2021 20:06, leerho wrote:
> >> Maurizio,
> >> I have updated the *MemoryCopy* and *TestMemoryCopy* to include
> >> references to the new *MemorySegment::CopyFrom(...)* and with byte
> >> swap capabilities.
> >>
> >> I have been able to test the code in my local environment using a
> >> mock substitute for the new CopyFrom(), but alas, I could not get
> >> Jtreg to work, so i am sending you the code as updated in
> >> https://github.com/leerho/mcimadamore_panama-foreign
> >> <
> https://urldefense.com/v3/__https://github.com/leerho/mcimadamore_panama-foreign__;!!GqivPVa7Brio!MZMNJXVSSBqQxv9G2nXnY-wpuBdgPpwIvBCl6CuzkZLWKaRjEAPnl1FHib5FeUyX3rF3rRU$
> >
> >>
> >> Please test it, when you have a chance.
> >>
> >> Lee.
> >>
> >>
> >> On Tue, Jun 15, 2021 at 5:43 AM Maurizio Cimadamore
> >> <maurizio.cimadamore at oracle.com
> >> <mailto:maurizio.cimadamore at oracle.com>> wrote:
> >>
> >>
> >>     >> The reason why copying is slower for small segments is that, I
> >>     think, my
> >>     >> benchmark iterations run in 4-5ns and, at these levels, you are
> >>     >> sensitive to the cost of the liveness checks. There's not a lot
> >>     we can
> >>     >> do to eliminate that - it's the price of safety.
> >>     > OK that's true. But in my own Unsafe.copyMemory code wasn't
> >>     doing MemorySegment.address().toRawLongValue() not also doing the
> >>     liveness check?
> >>     True - so the liveness check probably that won't make a lot of
> >>     difference in your case. But note that the bound checks are still
> >>     applied in MemorySegment::copyMemory.
> >>     >
> >>     >> The good news is that in the case of heap segment wrappers, we
> >> know
> >>     >> exactly that the size is gonna fit inside an int (it's an array
> >>     after
> >>     >> all!), so we can remove the check. If we remove the flag check,
> >>     and just
> >>     >> set the segment to always be treated as "SMALL", we get the
> >>     following
> >>     >> results:
> >>     > Is this really true? What about a huge long[] array, that could
> >>     be (2^31-8 maximum index) * 8 bytesPerLong = 16 gigabytes? (or are
> >>     those limited by the Java standard in maximum array size?)
> >>     in the PR I've submitted I only tweaked byte segment wrappers. We
> >>     could
> >>     resort to more complex internal representation for other heap
> >>     segments,
> >>     but I believe the true way forward is to wait for the long
> >>     optimizations, and to completely remove the SMALL segment hacks.
> >>     >
> >>     > Sorry, I missed that class. I was opening the pull request and
> >>     only looked at the red/green changes in MemorySegment. I missed
> >>     the first class.
> >>     >
> >>     > The methods provided there exactly replace my three shapes in
> >>     the code. And on top they allow to swap. Side note: MemoryCopy in
> >>     the current PR has the swapping code commented out.
> >>     Yeah - Lee is working on that MemoryCopy class (and associated
> >>     test). I
> >>     have provided the "swappy" copyFrom overload in MemorySegment, I
> >>     believe
> >>     Lee will add support for that soon.
> >>     >
> >>     > Last question: why does
> >>     https://bugs.openjdk.java.net/browse/JDK-8223051
> >>     <https://bugs.openjdk.java.net/browse/JDK-8223051> not help for
> >>     the integer vs. long loop variables? Does this not allow to remove
> >>     the small vs. large segment distinction? I thought this change in
> >>     hotspot was added to support long loops, if it is in fact "small".
> >>
> >>     My understanding is that the change has been split in multiple
> >>     chunks.
> >>     The chunk we mostly depend on is this:
> >>
> >>     https://bugs.openjdk.java.net/browse/JDK-8259609
> >>     <https://bugs.openjdk.java.net/browse/JDK-8259609>
> >>
> >>     (in fact I'm coordinating with Roland, the author of that work,
> >>     and he's
> >>     testing the patch against a version of panama which doesn't have
> >>     workarounds for small segments).
> >>
> >>     I did run all Panama benchmarks after JDK-8223051 was pushed, and
> >>     removed various workarounds, but  there was still a performance gap.
> >>     Roland reassured me that the gap should disappear once
> >> JDK-8259609 is
> >>     pushed.
> >>
> >>     Maurizio
> >>
> >>     >
> >>     > Uwe
> >>     >
> >>
>


More information about the panama-dev mailing list