RFR: 8271515: Integration of JEP 417: Vector API (Third Incubator) [v3]

Sandhya Viswanathan sviswanathan at openjdk.java.net
Tue Oct 19 01:11:52 UTC 2021


On Sat, 16 Oct 2021 00:56:14 GMT, Paul Sandoz <psandoz at openjdk.org> wrote:

>> This PR improves the performance of vector operations that accept masks on architectures that support masking in hardware, specifically Intel AVX512 and ARM SVE.
>> 
>> On architectures that do not support masking in hardware the same technique as before is applied to most operations, specifically composition using blend.
>> 
>> Masked loads/stores are a special form of masked operation that require additional care to ensure out-of-bounds access throw exceptions. The range checking has not been fully optimized and will require further work.
>> 
>> No API enhancements were required and only a few additional tests were needed.
>
> Paul Sandoz has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains seven commits:
> 
>  - Merge branch 'master' into JDK-8271515-vector-api
>  - Apply patch from https://github.com/openjdk/panama-vector/pull/152
>  - Apply patch from https://github.com/openjdk/panama-vector/pull/142
>  - Apply patch from https://github.com/openjdk/panama-vector/pull/139
>  - Apply patch from https://github.com/openjdk/panama-vector/pull/151
>  - Add new files.
>  - 8271515: Integration of JEP 417: Vector API (Third Incubator)

src/hotspot/share/utilities/globalDefinitions.hpp line 36:

> 34: 
> 35: #include COMPILER_HEADER(utilities/globalDefinitions)
> 36: #include "utilities/globalDefinitions_vecApi.hpp"

This change is not needed.

src/hotspot/share/utilities/globalDefinitions_vecApi.hpp line 29:

> 27: // the intent of this file to provide a header that can be included in .s files.
> 28: 
> 29: #ifndef SHARE_VM_UTILITIES_GLOBALDEFINITIONS_VECAPI_HPP

The file src/hotspot/share/utilities/globalDefinitions_vecApi.hpp is not needed.

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/AbstractMask.java line 67:

> 65: 
> 66:     @Override
> 67:     public boolean laneIsSet(int i) {

Missing ForceInline.

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Byte128Vector.java line 278:

> 276:     @Override
> 277:     @ForceInline
> 278:     public Byte128Vector lanewise(Unary op, VectorMask<Byte> m) {

Should this method be final as well?

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Byte128Vector.java line 290:

> 288:     @Override
> 289:     @ForceInline
> 290:     public Byte128Vector lanewise(Binary op, Vector<Byte> v, VectorMask<Byte> m) {

Should this method be final as well?

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Byte128Vector.java line 313:

> 311:     public final
> 312:     Byte128Vector
> 313:     lanewise(Ternary op, Vector<Byte> v1, Vector<Byte> v2) {

For unary and binary operator above, we use VectorOperators.Unary and VectorOperators.Binary.
Should we use VectorOperators.Ternary here as well then?

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Byte128Vector.java line 321:

> 319:     public final
> 320:     Byte128Vector
> 321:     lanewise(Ternary op, Vector<Byte> v1, Vector<Byte> v2, VectorMask<Byte> m) {

Should we use VectorOperators.Ternary here?

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Byte128Vector.java line 731:

> 729:         @Override
> 730:         @ForceInline
> 731:         public long toLong() {

Should this and other mask operation methods be final methods?

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/ByteVector.java line 603:

> 601:         if (opKind(op, VO_SPECIAL)) {
> 602:             if (op == ZOMO) {
> 603:                 return blend(broadcast(-1), compare(NE, 0, m));

This doesn't look correct. The lanes where mask is false should get the original lane value in this vector.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5873


More information about the core-libs-dev mailing list