[foreign-memaccess] RFR 8231402: layout API implementation is not constant enough
Jorn Vernee
jorn.vernee at oracle.com
Wed Sep 25 13:28:03 UTC 2019
On 25/09/2019 14:09, Maurizio Cimadamore wrote:
>
> On 25/09/2019 12:53, Jorn Vernee wrote:
>> Hi,
>>
>> Patch looks good!
>>
>> Some minor comments:
>>
>> MemorySegment.java
>> - Minor typo @58: "using the one of the provided factory methods"
>> - You removed the SecurityManager check from ofByteBuffer. Isn't it
>> needed?
>
> my feeling/reasoning on the security check - the buffer has already
> been created - how creating another view is more 'insecure' ?
Ok. I was just wondering if this was something that got removed during
testing and then forgotten to be added back :)
Jorn
>
> Maurizio
>
>>
>> Cheers,
>> Jorn
>>
>> On 24/09/2019 16:06, Maurizio Cimadamore wrote:
>>> Hi,
>>> as the subject says, the implementation classes of the layout API do
>>> not always store their properties into final fields, and they resort
>>> to lazy computation, etc. This negatively impacts C2 scrutability of
>>> same data structures.
>>>
>>> This patch fixes this situation, by changing size/alignment to be
>>> final fields in AbstractLayout - so that they will have to be
>>> provided before hand. I've added, for clarity, and extra 'default'
>>> constructor to all layout implementation classes which allows to
>>> create a layout with standard alignment and empty name.
>>>
>>> There are also few minor changes:
>>>
>>> * I've tweaked VM to also trust final fields in the layout package
>>>
>>> * I've rearranged some some scope classes so that their creation is
>>> less straightforward, more transparent and requires less reflective
>>> checks. This is particularly evident in HeapScope and BufferScope.
>>> Note that I also changed the public API of MemorySegment::ofArray
>>> and replaced that with multiple overloads (one per primitive array).
>>> This is good because it makes the code more 'static' and also
>>> because it removes the possibility for the user to pass in a wrong
>>> array type.
>>>
>>> * I've re-ordered the way in which scope vs. segment is created -
>>> that is, instead of this
>>>
>>> new XYZSegment(.., ..., ..., new XYZScope(...))
>>>
>>> We now do this:
>>>
>>> XYZScope scope = new XYZScope(...);
>>> new XYZSegment(.., ..., ..., scope)
>>>
>>> As this makes a difference for C2 (Vlad pointed this out).
>>>
>>> Webrev:
>>>
>>> http://cr.openjdk.java.net/~mcimadamore/panama/8231402_v2/
>>>
>>>
>>> With this patch, the level of performances of the memory access API
>>> is virtually on par with Unsafe in our suite of synthetic
>>> benchmarks, at least when using the Graal compiler (*). With C2
>>> there are still issues which have to do mainly with (i) escape
>>> analysis not being aggressive enough (a VM patch is required) and
>>> (ii) inlining not working well in relatively 'cold' code (e.g.
>>> segment creation/closure), so that some manual sprinkling of
>>> @ForceInline annotations is required. I will pursue these in a
>>> follow up patch.
>>>
>>> Maurizio
>>>
>>> (*) the only exception to this is a test which performs indexed
>>> access, in which Graal compiler is not able to vectorize the loop
>>> when using the memory access API (because of the presence of address
>>> operation on longs); that said, performance of code compiled by the
>>> Graal compiler with the memory access API is still superior than
>>> that of C2 using unsafe (I'm also following up with the Graal
>>> compiler team on this issue). There also seems to be an issue with
>>> the liveness check which is never hoisted out of hot loops - leading
>>> to slightly slower performances; in C2 we have a similar issue and
>>> it's caused by the fact that the VM puts a memory barrier after
>>> Unsafe memory access calls (since the Unsafe call could touch the
>>> loop invariant itself!). We obviously need to relax some of these
>>> checks if the Unsafe call occurs from within the memory access API
>>> (which does not allow arbitrary read/write of Java fields).
>>>
>>>
>>>
More information about the panama-dev
mailing list