Memory Segment efficient array handling
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Jun 17 15:44:39 UTC 2021
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