[vector] RFR (L): Generalized intrinsics for vector operations (first batch)
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Fri Feb 9 21:38:32 UTC 2018
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