Vector API: stack overflow on Big Endian

Doerr, Martin martin.doerr at sap.com
Thu Oct 22 13:23:55 UTC 2020


Hi Paul,

thanks a lot for your help. Your fix is working fine.

With that, I can only see one test failing:
VectorReshapeTests

Failing with Species[byte, 16, S_128_BIT]->Species[short, 8, S_128_BIT] (lanewise), partLimit=2, block=8, part=0, origin=0
Failing with Species[byte, 32, S_256_BIT]->Species[short, 16, S_256_BIT] (lanewise), partLimit=2, block=16, part=0, origin=0
Failing with Species[byte, 64, S_512_BIT]->Species[short, 32, S_512_BIT] (lanewise), partLimit=2, block=32, part=0, origin=0
Failing with Species[byte, 8, S_64_BIT]->Species[short, 4, S_64_BIT] (lanewise), partLimit=2, block=4, part=0, origin=0
Failing with Species[byte, 8, S_Max_BIT]->Species[short, 4, S_Max_BIT] (lanewise), partLimit=2, block=4, part=0, origin=0

All of them fail because pairs are swapped like this:
expect: [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0]
output: [0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8]

Do you know if that's another endianness problem?

Best regards,
Martin


> -----Original Message-----
> From: Paul Sandoz <paul.sandoz at oracle.com>
> Sent: Donnerstag, 22. Oktober 2020 02:27
> To: Doerr, Martin <martin.doerr at sap.com>
> Cc: hotspot-compiler-dev at openjdk.java.net
> Subject: Re: Vector API: stack overflow on Big Endian
> 
> Hi Martin,
> 
> We definitely have far less exposure by default to BE platforms now that
> SPARC is not a thing, it's easy to unintentionally hardcode a bias to LE.
> 
> Would it be possible to try running the tests on your BE platforms with the
> following modification?
> 
> ---
> a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/AbstractVect
> or.java
> +++
> b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/AbstractVect
> or.java
> @@ -500,7 +500,7 @@ abstract class AbstractVector<E> extends Vector<E> {
>      final <F>
>      AbstractVector<F> defaultReinterpret(AbstractSpecies<F> rsp) {
>          int blen = Math.max(this.bitSize(), rsp.vectorBitSize()) / Byte.SIZE;
> -        ByteOrder bo = ByteOrder.LITTLE_ENDIAN;
> +        ByteOrder bo = ByteOrder.nativeOrder();//LITTLE_ENDIAN;
>          ByteBuffer bb = ByteBuffer.allocate(blen);
>          this.intoByteBuffer(bb, 0, bo);
>          VectorMask<F> m = rsp.maskAll(true);
> 
> Paul.
> 
> 
> > On Oct 21, 2020, at 4:10 AM, Doerr, Martin <martin.doerr at sap.com>
> wrote:
> >
> > Hi,
> >
> > I noticed stack overflow issues because of endless recursion on Big Endian
> platforms (s390 and PPC64) in several tests:
> >
> > E.g. Int64VectorLoadStoreTests:
> >
> >        at
> jdk.incubator.vector/jdk.incubator.vector.IntVector.maybeSwap(IntVector.j
> ava:3330)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.IntVector.intoByteBuffer(IntVecto
> r.java:3151)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.AbstractVector.defaultReinterpret
> (AbstractVector.java:505)
> >        at
> java.base/jdk.internal.vm.vector.VectorSupport.convert(VectorSupport.java
> :441)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.AbstractVector.convert0(Abstract
> Vector.java:686)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.AbstractVector.asVectorRawTemp
> late(AbstractVector.java:173)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.AbstractVector.asByteVectorRawT
> emplate(AbstractVector.java:179)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.Int64Vector.asByteVectorRaw(Int
> 64Vector.java:177)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.Int64Vector.asByteVectorRaw(Int
> 64Vector.java:41)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.IntVector.reinterpretAsBytes(IntV
> ector.java:3366)
> >        at
> jdk.incubator.vector/jdk.incubator.vector.IntVector.maybeSwap(IntVector.j
> ava:3330)
> >
> > Note that maybeSwap is endianness sensitive:
> >    IntVector maybeSwap(ByteOrder bo) {
> >        if (bo != NATIVE_ENDIAN) {
> >            return this.reinterpretAsBytes()
> >                .rearrange(swapBytesShuffle())
> >                .reinterpretAsInts();
> >        }
> >        return this;
> >    }
> >
> > How is this supposed to work?
> > Is anything platform specific missing?
> >
> > Thanks and best regards,
> > Martin
> >



More information about the hotspot-compiler-dev mailing list