RFR (XXL): 8223347: Integration of Vector API (Incubator): General HotSpot changes

Viswanathan, Sandhya sandhya.viswanathan at intel.com
Wed Aug 5 00:16:44 UTC 2020


Thanks a lot for the review.

Best Regards,
Sandhya

-----Original Message-----
From: Vladimir Kozlov <vladimir.kozlov at oracle.com> 
Sent: Tuesday, August 04, 2020 1:00 PM
To: Viswanathan, Sandhya <sandhya.viswanathan at intel.com>; Vladimir Ivanov <vladimir.x.ivanov at oracle.com>; hotspot-dev <hotspot-dev at openjdk.java.net>; hotspot compiler <hotspot-compiler-dev at openjdk.java.net>
Cc: panama-dev <panama-dev at openjdk.java.net>
Subject: Re: RFR (XXL): 8223347: Integration of Vector API (Incubator): General HotSpot changes

x86 changes seems fine.

Thanks,
Vladimir K

On 7/29/20 11:19 AM, Viswanathan, Sandhya wrote:
> Hi,
> 
> Likewise, the corresponding x86 backend changes since first review are also only minor cleanups and simple bug fixes:
> 
> X86:
>     Full: http://cr.openjdk.java.net/~sviswanathan/VAPI_RFR/x86_webrev/webrev.01/
>     Incremental: 
> http://cr.openjdk.java.net/~sviswanathan/VAPI_RFR/x86_webrev/webrev.00
> -webrev.01/
> 
> Summary:
>     - rebased to jdk/jdk tip;
>     - backend changes related to removal of NotV, VLShiftV, VRShiftV, VURShiftV nodes;
>     - vector insert bug fix
>     - some minor cleanups
> 
> Older webrev links for your reference:
>     X86b backend: 
> http://cr.openjdk.java.net/~sviswanathan/VAPI_RFR/x86_webrev/webrev.00
> /
> 
> Best Regards,
> Sandhya
> 
> -----Original Message-----
> From: Vladimir Ivanov <vladimir.x.ivanov at oracle.com>
> Sent: Tuesday, July 28, 2020 3:30 PM
> To: hotspot-dev <hotspot-dev at openjdk.java.net>; hotspot compiler 
> <hotspot-compiler-dev at openjdk.java.net>
> Cc: Viswanathan, Sandhya <sandhya.viswanathan at intel.com>; panama-dev 
> <panama-dev at openjdk.java.net>
> Subject: Re: RFR (XXL): 8223347: Integration of Vector API 
> (Incubator): General HotSpot changes
> 
> Hi,
> 
> Thanks for the feedback on webrev.00, Remi, Coleen, Vladimir K., and Ekaterina!
> 
> Here are the latest changes for Vector API support in HotSpot shared code:
>   
> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.shar
> ed/webrev.01
> 
> Incremental changes (diff against webrev.00):
>   
> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.shar
> ed/webrev.01_00
> 
> I decided to post it here and not initiate a new round of reviews because the changes are mostly limited to minor cleanups / simple bug fixes.
> 
> Detailed summary:
>     - rebased to jdk/jdk tip;
>     - got rid of NotV, VLShiftV, VRShiftV, VURShiftV nodes;
>     - restore lazy cleanup logic during incremental inlining (see needs_cleanup in compile.cpp);
>     - got rid of x86-specific changes in shared code;
>     - fix for 8244867 [1];
>     - fix Graal test failure: enumerate VectorSupport intrinsics in CheckGraalIntrinsics
>     - numerous minor cleanups
> 
> Best regards,
> Vladimir Ivanov
> 
> [1] http://hg.openjdk.java.net/panama/dev/rev/dcfc7b6e8977
>       http://jbs.oracle.com/browse/JDK-8244867
>       8244867: 2 vector api tests crash with
> assert(is_reference_type(basic_type())) failed: wrong type
> Summary: Adding safety checks to prevent intrinsification if class arguments of non-primitive types are uninitialized.
> 
> On 04.04.2020 02:12, Vladimir Ivanov wrote:
>> Hi,
>>
>> Following up on review requests of API [0] and Java implementation 
>> [1] for Vector API (JEP 338 [2]), here's a request for review of 
>> general HotSpot changes (in shared code) required for supporting the API:
>>
>>
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r
>> ed/webrev.00/all.00-03/
>>
>>
>> (First of all, to set proper expectations: since the JEP is still in 
>> Candidate state, the intention is to initiate preliminary round(s) of 
>> review to inform the community and gather feedback before sending out 
>> final/official RFRs once the JEP is Targeted to a release.)
>>
>> Vector API (being developed in Project Panama [3]) relies on JVM 
>> support to utilize optimal vector hardware instructions at runtime. 
>> It interacts with JVM through intrinsics (declared in 
>> jdk.internal.vm.vector.VectorSupport [4]) which expose vector 
>> operations support in C2 JIT-compiler.
>>
>> As Paul wrote earlier: "A vector intrinsic is an internal low-level 
>> vector operation. The last argument to the intrinsic is fall back 
>> behavior in Java, implementing the scalar operation over the number 
>> of elements held by the vector.  Thus, If the intrinsic is not 
>> supported in
>> C2 for the other arguments then the Java implementation is executed 
>> (the Java implementation is always executed when running in the 
>> interpreter or for C1)."
>>
>> The rest of JVM support is about aggressively optimizing vector boxes 
>> to minimize (ideally eliminate) the overhead of boxing for vector values.
>> It's a stop-the-gap solution for vector box elimination problem until 
>> inline classes arrive. Vector classes are value-based and in the 
>> longer term will be migrated to inline classes once the support becomes available.
>>
>> Vector API talk from JVMLS'18 [5] contains brief overview of JVM 
>> implementation and some details.
>>
>> Complete implementation resides in vector-unstable branch of 
>> panama/dev repository [6].
>>
>> Now to gory details (the patch is split in multiple "sub-webrevs"):
>>
>> ===========================================================
>>
>> (1)
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r
>> ed/webrev.00/00.backend.shared/
>>
>>
>> Ideal vector nodes for new operations introduced by Vector API.
>>
>> (Platform-specific back end support will be posted for review separately).
>>
>> ===========================================================
>>
>> (2)
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r
>> ed/webrev.00/01.intrinsics/
>>
>>
>> JVM Java interface (VectorSupport) and intrinsic support in C2.
>>
>> Vector instances are initially represented as VectorBox macro nodes 
>> and "unboxing" is represented by VectorUnbox node. It simplifies 
>> vector box elimination analysis and the nodes are expanded later right before EA pass.
>>
>> Vectors have 2-level on-heap representation: for the vector value 
>> primitive array is used as a backing storage and it is encapsulated 
>> in a typed wrapper (e.g., Int256Vector - vector of 8 ints - contains 
>> a int[8] instance which is used to store vector value).
>>
>> Unless VectorBox node goes away, it needs to be expanded into an 
>> allocation eventually, but it is a pure node and doesn't have any JVM 
>> state associated with it. The problem is solved by keeping JVM state 
>> separately in a VectorBoxAllocate node associated with VectorBox node 
>> and use it during expansion.
>>
>> Also, to simplify vector box elimination, inlining of vector reboxing 
>> calls (VectorSupport::maybeRebox) is delayed until the analysis is over.
>>
>> ===========================================================
>>
>> (3)
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r
>> ed/webrev.00/02.vbox_elimination/
>>
>>
>> Vector box elimination analysis implementation. (Brief overview:
>> slides
>> #36-42 [5].)
>>
>> The main part is devoted to scalarization across safepoints and 
>> rematerialization support during deoptimization. In C2-generated code 
>> vector operations work with raw vector values which live in registers 
>> or spilled on the stack and it allows to avoid boxing/unboxing when a 
>> vector value is alive across a safepoint. As with other values, 
>> there's just a location of the vector value at the safepoint and 
>> vector type information recorded in the relevant nmethod metadata and 
>> all the heavy-lifting happens only when rematerialization takes place.
>>
>> The analysis preserves object identity invariants except during 
>> aggressive reboxing (guarded by -XX:+EnableAggressiveReboxing).
>>
>> (Aggressive reboxing is crucial for cases when vectors "escape": it 
>> allocates a fresh instance at every escape point thus enabling 
>> original instance to go away.)
>>
>> ===========================================================
>>
>> (4)
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r
>> ed/webrev.00/03.module.hotspot/
>>
>>
>> HotSpot changes for jdk.incubator.vector module. Vector support is 
>> makred experimental and turned off by default. JEP 338 proposes the 
>> API to be released as an incubator module, so a user has to specify 
>> "--add-module jdk.incubator.vector" on the command line to be able to 
>> use it.
>> When user does that, JVM automatically enables Vector API support.
>> It improves usability (user doesn't need to separately "open" the API 
>> and enable JVM support) while minimizing risks of destabilitzation 
>> from new code when the API is not used.
>>
>>
>> That's it! Will be happy to answer any questions.
>>
>> And thanks in advance for any feedback!
>>
>> Best regards,
>> Vladimir Ivanov
>>
>> [0]
>> https://mail.openjdk.java.net/pipermail/core-libs-dev/2020-March/0653
>> 4
>> 5.html
>>
>>
>> [1]
>> https://mail.openjdk.java.net/pipermail/hotspot-dev/2020-April/041228.
>> html
>>
>> [2] https://openjdk.java.net/jeps/338
>>
>> [3] https://openjdk.java.net/projects/panama/
>>
>> [4]
>> http://cr.openjdk.java.net/~vlivanov/panama/vector/jep338/hotspot.sha
>> r 
>> ed/webrev.00/01.intrinsics/src/java.base/share/classes/jdk/internal/v
>> m
>> /vector/VectorSupport.java.html
>>
>>
>> [5]
>> http://cr.openjdk.java.net/~vlivanov/talks/2018_JVMLS_VectorAPI.pdf
>>
>> [6] http://hg.openjdk.java.net/panama/dev/shortlog/92bbd44386e9
>>
>>       $ hg clone http://hg.openjdk.java.net/panama/dev/ -b 
>> vector-unstable


More information about the hotspot-compiler-dev mailing list