[vector] RFR (L): Generalized intrinsics for vector operations (first batch)
Paul Sandoz
paul.sandoz at oracle.com
Fri Feb 9 22:14:57 UTC 2018
Looks good.
139 @Override
140 @ForceInline
141 public $vectortype$ add(Vector<$Boxtype$,Shapes.$shape$> v) {
142 Objects.requireNonNull(v);
143 return ($vectortype$) VectorIntrinsics.binaryOp(
144 VECTOR_OP_ADD, $vectortype$.class, $type$.class, LENGTH,
145 this, ($vectortype$)v,
146 (v1, v2) -> (($vectortype$)v1).bOp(v2, (i, a, b) -> ($type$)(a + b)));
147 }
Given you perform the cast at line 145, so both input vectors are of the same concrete type, do you require it on v1 in the lambda?
Paul.
> On Feb 9, 2018, at 1:38 PM, Vladimir Ivanov <vladimir.x.ivanov at oracle.com> wrote:
>
> http://cr.openjdk.java.net/~vlivanov/panama/vector.generalized_intrinsics/webrev.06/
>
> Here's the first batch of rewritten intrinsics for vector operations.
>
> Main motivation for new implementation is:
> * reduce number of intrinsic needed;
> * improve intrinsification robustness;
> * minimize changes needed in shared C2 code.
>
> The idea of generalized intrinsics is to parameterize them with additional information (passed as constant arguments), so JIT-compiler has enough information to dispatch to proper implementation during intrinsification.
>
> For example, binary vector operation can be represented as:
>
> // (V,V) -> V
> @HotSpotIntrinsicCandidate
> static <V> V binaryOp(int oprId, Class<V> vectorClass,
> Class<?> elementType, int vlen,
> V v1, V v2,
> BiFunction<V,V,V> defaultImpl) {
> return defaultImpl.apply(v1, v2);
> }
>
> and used as:
>
> // (Int256Vector,Int256Vector) -> Int256Vector
>
> public Int256Vector add(Vector<Integer,Shapes.S256Bit> v) {
> return (Int256Vector) VectorIntrinsics.binaryOp(
> VECTOR_OP_ADD,
> Int256Vector.class, int.class, 8,
> this, (Int256Vector)v,
> (v1, v2) -> ((Int256Vector)v1).bOp(v2,
> (i, a, b) -> (int)(a+b)));
> }
>
> where:
> oprId encodes actual operation (VECTOR_OP_ADD);
>
> vectorClass, elementType, vlen describe concrete vector class (Int256Vector);
>
> v1, v2 are actual arguments of vector binary operations;
>
> defaultImpl - scalar implementation which is used when intrinsification fails.
>
>
> Generalized intrinsics are declared on jdk.incubator.vector.VectorIntrinsics and the patch contains 6 of them:
> * broadcastCoerced
> * reductionCoerced
> * binaryOp
> * load/store
> * test
>
> The following vector operations were ported to new mechanism:
> * broadcast: zero, broadcast, trueMask, falseMask
> * reduction: addAll, mulAll
> * binaryOp: add, sub, mul, div, and, or, xor
> * load/store: intoArray, fromArray
> * test: anyTrue, allTrue
>
> There's new flag added to turn new intrinsics on/off:
>
> + product(bool, UseVectorApiGeneralizedIntrinsics, true,
>
> Previous discussions [1] [2].
>
> The patch adds alternative implementations, but doesn't remove existing ones, since there are some code dependencies on them. Once the dependencies are broken, the code will go away.
>
> Thanks!
>
> Best regards,
> Vladimir Ivanov
>
> [1] http://mail.openjdk.java.net/pipermail/panama-dev/2017-November/000748.html
>
> [2] http://mail.openjdk.java.net/pipermail/panama-dev/2017-December/000884.html
More information about the panama-dev
mailing list