Skip to content

Commit

Permalink
8296767: Support multi-field based vector classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jatin Bhateja authored and Paul Sandoz committed Nov 23, 2022
1 parent ff1901b commit 8159184
Show file tree
Hide file tree
Showing 53 changed files with 4,269 additions and 7,944 deletions.
2 changes: 1 addition & 1 deletion make/common/JavaCompilation.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ define SetupJavaCompilationBody
# Tell javac to do exactly as told and no more
PARANOIA_FLAGS := -implicit:none -Xprefer:source -XDignore.symbol.file=true -encoding ascii

$1_FLAGS += -g -Xlint:all $$($1_TARGET_RELEASE) $$(PARANOIA_FLAGS) $$(JAVA_WARNINGS_ARE_ERRORS)
$1_FLAGS += -g -XDenablePrimitiveClasses -Xlint:all $$($1_TARGET_RELEASE) $$(PARANOIA_FLAGS) $$(JAVA_WARNINGS_ARE_ERRORS)
$1_FLAGS += $$($1_JAVAC_FLAGS)

ifneq ($$($1_DISABLED_WARNINGS), )
Expand Down
6 changes: 5 additions & 1 deletion src/hotspot/share/classfile/javaClasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5149,7 +5149,11 @@ int vector_VectorPayload::_payload_offset;

void vector_VectorPayload::compute_offsets() {
InstanceKlass* k = vmClasses::vector_VectorPayload_klass();
VECTORPAYLOAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
//FIXME: VectorPayload class no longer holds the Object payload.
//Multi-field based payloads have been moved to leaf level
//concrete classes. Offset recorded here is used for object
//re-construction during de-opt.
// VECTORPAYLOAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
}

#if INCLUDE_CDS
Expand Down
7 changes: 7 additions & 0 deletions src/hotspot/share/classfile/vmClassMacros.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,13 @@
do_klass(vector_VectorMask_klass, jdk_internal_vm_vector_VectorMask ) \
do_klass(vector_VectorShuffle_klass, jdk_internal_vm_vector_VectorShuffle ) \
\
/* support multi-field based vectors */ \
do_klass(vector_VectorPayloadMF64_klass, jdk_internal_vm_vector_VectorPayloadMF64 ) \
do_klass(vector_VectorPayloadMF128_klass, jdk_internal_vm_vector_VectorPayloadMF128 ) \
do_klass(vector_VectorPayloadMF256_klass, jdk_internal_vm_vector_VectorPayloadMF256 ) \
do_klass(vector_VectorPayloadMF512_klass, jdk_internal_vm_vector_VectorPayloadMF512 ) \
\
\
/* GC support */ \
do_klass(FillerObject_klass, jdk_internal_vm_FillerObject ) \
\
Expand Down
18 changes: 14 additions & 4 deletions src/hotspot/share/classfile/vmSymbols.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@
#define VM_SYMBOL_IGNORE(id, name) /*ignored*/
#define VM_ALIAS_IGNORE(id, id2) /*ignored*/

// Mapping function names to values. New entries should be added below.

// Mapping function names to values. New entries should be added below.
#define VM_SYMBOLS_DO(template, do_alias) \
/* commonly used class, package, module names */ \
template(java_base, "java.base") \
Expand Down Expand Up @@ -94,9 +94,13 @@
template(jdk_internal_vm_vector_Vector, "jdk/internal/vm/vector/VectorSupport$Vector") \
template(jdk_internal_vm_vector_VectorMask, "jdk/internal/vm/vector/VectorSupport$VectorMask") \
template(jdk_internal_vm_vector_VectorShuffle, "jdk/internal/vm/vector/VectorSupport$VectorShuffle") \
template(payload_name, "payload") \
template(ETYPE_name, "ETYPE") \
template(VLENGTH_name, "VLENGTH") \
template(jdk_internal_vm_vector_VectorPayloadMF64, "jdk/internal/vm/vector/VectorSupport$VectorPayloadMF64") \
template(jdk_internal_vm_vector_VectorPayloadMF128, "jdk/internal/vm/vector/VectorSupport$VectorPayloadMF128") \
template(jdk_internal_vm_vector_VectorPayloadMF256, "jdk/internal/vm/vector/VectorSupport$VectorPayloadMF256") \
template(jdk_internal_vm_vector_VectorPayloadMF512, "jdk/internal/vm/vector/VectorSupport$VectorPayloadMF512") \
template(payload_name, "payload") \
template(ETYPE_name, "ETYPE") \
template(VLENGTH_name, "VLENGTH") \
\
template(jdk_internal_vm_FillerObject, "jdk/internal/vm/FillerObject") \
\
Expand Down Expand Up @@ -265,6 +269,12 @@
template(jdk_internal_vm_annotation_MultiField_signature, "Ljdk/internal/vm/annotation/MultiField;") \
template(jdk_internal_ValueBased_signature, "Ljdk/internal/ValueBased;") \
\
/* VectorAPI support */ \
template(vector_VectorPayloadMF64_signature, "Qjdk/internal/vm/vector/VectorSupport$VectorPayloadMF64;") \
template(vector_VectorPayloadMF128_signature, "Qjdk/internal/vm/vector/VectorSupport$VectorPayloadMF128;") \
template(vector_VectorPayloadMF256_signature, "Qjdk/internal/vm/vector/VectorSupport$VectorPayloadMF256;") \
template(vector_VectorPayloadMF512_signature, "Qjdk/internal/vm/vector/VectorSupport$VectorPayloadMF512;") \
\
/* class symbols needed by intrinsics */ \
VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, template, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE) \
\
Expand Down
179 changes: 165 additions & 14 deletions src/java.base/share/classes/jdk/internal/vm/vector/VectorSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,14 @@

package jdk.internal.vm.vector;

import java.util.Objects;
import jdk.internal.vm.annotation.IntrinsicCandidate;
import jdk.internal.vm.annotation.MultiField;
import jdk.internal.misc.Unsafe;


import java.util.function.*;
import java.lang.reflect.*;

public class VectorSupport {
static {
Expand Down Expand Up @@ -148,35 +152,182 @@ public class VectorSupport {

/* ============================================================================ */

public static class VectorSpecies<E> {}
public static class VectorSpecies<E> { }

public abstract static class VectorPayload {
protected abstract Object getPayload();
}

public static abstract class Vector<E> extends VectorPayload { }

public static class VectorPayload {
public static class VectorShuffle<E> extends VectorPayload {
private final Object payload; // array of primitives

public VectorPayload(Object payload) {
protected final Object getPayload() {
return VectorSupport.maybeRebox(this).payload;
}
public VectorShuffle(Object payload) {
this.payload = payload;
}
}

public static class VectorMask<E> extends VectorPayload {
private final Object payload; // array of primitives

protected final Object getPayload() {
return VectorSupport.maybeRebox(this).payload;
}
public VectorMask(Object payload) {
this.payload = payload;
}
}

public static class Vector<E> extends VectorPayload {
public Vector(Object payload) {
super(payload);
public abstract static class VectorPayloadMF {
public abstract long multiFieldOffset();

private static VectorPayloadMF newInstanceFactory(int elemSize, int length) {
VectorPayloadMF obj = null;
int vecSize = elemSize * length;
switch(vecSize) {
case 8: obj = new VectorPayloadMF64(); break;
case 16: obj = new VectorPayloadMF128(); break;
case 32: obj = new VectorPayloadMF256(); break;
case 64: obj = new VectorPayloadMF512(); break;
default: assert false : "Unhandled vector size";
}
return obj;
}
}

public static class VectorShuffle<E> extends VectorPayload {
public VectorShuffle(Object payload) {
super(payload);
public static VectorPayloadMF createVectPayloadInstance(int elemSize, int length) {
return newInstanceFactory(elemSize, length);
}
}
public static class VectorMask<E> extends VectorPayload {
public VectorMask(Object payload) {
super(payload);

public static VectorPayloadMF createVectPayloadInstanceB(int elemSize, int length, byte [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putByte(obj, start_offset + i * Byte.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public static VectorPayloadMF createVectPayloadInstanceS(int elemSize, int length, short [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putShort(obj, start_offset + i * Short.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public static VectorPayloadMF createVectPayloadInstanceI(int elemSize, int length, int [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putInt(obj, start_offset + i * Integer.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public static VectorPayloadMF createVectPayloadInstanceL(int elemSize, int length, long [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putLong(obj, start_offset + i * Long.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public static VectorPayloadMF createVectPayloadInstanceF(int elemSize, int length, float [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putFloat(obj, start_offset + i * Float.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public static VectorPayloadMF createVectPayloadInstanceD(int elemSize, int length, double [] init) {
VectorPayloadMF obj = newInstanceFactory(elemSize, length);
long start_offset = obj.multiFieldOffset();
obj = Unsafe.getUnsafe().makePrivateBuffer(obj);
for (int i = 0; i < length; i++) {
Unsafe.getUnsafe().putDouble(obj, start_offset + i * Double.BYTES, init[i]);
}
obj = Unsafe.getUnsafe().finishPrivateBuffer(obj);
return obj;
}

public int length(int elemSize) {
try {
var field = this.getClass().getDeclaredField("mfield");
var msanno = field.getAnnotationsByType(MultiField.class);

Objects.nonNull(msanno);

assert msanno.length == 1;
return msanno[0].value() / elemSize;
} catch (Exception e) {
System.out.println(e);
}
return -1;
}

public static long multiFieldOffset(Class<? extends VectorPayloadMF> cls) {
try {
var field = cls.getDeclaredField("mfield");
return Unsafe.getUnsafe().objectFieldOffset(field);
} catch (Exception e) {
System.out.println(e);
}
return -1L;
}
}

public primitive static class VectorPayloadMF64 extends VectorPayloadMF {
@MultiField(value = 8)
byte mfield = 0;
static long MFOFFSET = multiFieldOffset(VectorPayloadMF64.class);

@Override
public long multiFieldOffset() { return MFOFFSET;}
}

public primitive static class VectorPayloadMF128 extends VectorPayloadMF {
@MultiField(value = 16)
byte mfield = 0;
static long MFOFFSET = multiFieldOffset(VectorPayloadMF128.class);

@Override
public long multiFieldOffset() { return MFOFFSET;}
}

public primitive static class VectorPayloadMF256 extends VectorPayloadMF {
@MultiField(value = 32)
byte mfield = 0;
static long MFOFFSET = multiFieldOffset(VectorPayloadMF256.class);

@Override
public long multiFieldOffset() { return MFOFFSET;}
}

public primitive static class VectorPayloadMF512 extends VectorPayloadMF {
@MultiField(value = 64)
byte mfield = 0;
static long MFOFFSET = multiFieldOffset(VectorPayloadMF512.class);

@Override
public long multiFieldOffset() { return MFOFFSET;}
}

/* ============================================================================ */
Expand Down
Loading

0 comments on commit 8159184

Please sign in to comment.