From b9a3b6b0fa7bf957d5b7c989c76ab80c40bfbeac Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Mon, 12 Jun 2023 21:14:29 +0100 Subject: [PATCH 1/6] initial panama vector 21 port changes --- gradle/generation/extract-jdk-apis.gradle | 2 +- .../extract-jdk-apis/ExtractJdkApis.java | 2 +- lucene/core/src/generated/jdk/jdk21.apijar | Bin 16543 -> 56723 bytes .../lucene/util/VectorUtilProvider.java | 6 +- .../lucene/util/VectorUtilPanamaProvider.java | 493 ++++++++++++++++++ 5 files changed, 498 insertions(+), 5 deletions(-) create mode 100644 lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.java diff --git a/gradle/generation/extract-jdk-apis.gradle b/gradle/generation/extract-jdk-apis.gradle index 6a5fb5ad8fd0..78e74aa261a3 100644 --- a/gradle/generation/extract-jdk-apis.gradle +++ b/gradle/generation/extract-jdk-apis.gradle @@ -20,7 +20,7 @@ def resources = scriptResources(buildscript) configure(rootProject) { ext { // also change this in extractor tool: ExtractForeignAPI - vectorIncubatorJavaVersions = [ JavaVersion.VERSION_20 ] as Set + vectorIncubatorJavaVersions = [ JavaVersion.VERSION_20, JavaVersion.VERSION_21 ] as Set } } diff --git a/gradle/generation/extract-jdk-apis/ExtractJdkApis.java b/gradle/generation/extract-jdk-apis/ExtractJdkApis.java index 7121374850bd..6eaf27127f7d 100644 --- a/gradle/generation/extract-jdk-apis/ExtractJdkApis.java +++ b/gradle/generation/extract-jdk-apis/ExtractJdkApis.java @@ -56,7 +56,7 @@ public final class ExtractJdkApis { static final Map> CLASSFILE_PATTERNS = Map.of( 19, List.of(PATTERN_PANAMA_FOREIGN), 20, List.of(PATTERN_PANAMA_FOREIGN, PATTERN_VECTOR_VM_INTERNALS, PATTERN_VECTOR_INCUBATOR), - 21, List.of(PATTERN_PANAMA_FOREIGN) + 21, List.of(PATTERN_PANAMA_FOREIGN, PATTERN_VECTOR_VM_INTERNALS, PATTERN_VECTOR_INCUBATOR) ); public static void main(String... args) throws IOException { diff --git a/lucene/core/src/generated/jdk/jdk21.apijar b/lucene/core/src/generated/jdk/jdk21.apijar index 69906ccf4b06b66820c34c8a899512675d5ff482..2f3670a9f1275069300b84be0b655788a8d0451a 100644 GIT binary patch delta 39281 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

%{su#NBc2sZp`_8Z~ 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 20 && runtimeVersion <= 21) { // is locale sane (only buggy in Java 20) if (isAffectedByJDK8301190()) { LOG.warning( @@ -98,9 +98,9 @@ static VectorUtilProvider lookup() { } catch (ClassNotFoundException cnfe) { throw new LinkageError("VectorUtilPanamaProvider is missing in Lucene JAR file", cnfe); } - } else if (runtimeVersion >= 21) { + } else if (runtimeVersion >= 22) { LOG.warning( - "You are running with Java 21 or later. To make full use of the Vector API, please update Apache Lucene."); + "You are running with Java 22 or later. To make full use of the Vector API, please update Apache Lucene."); } return new VectorUtilDefaultProvider(); } diff --git a/lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.java b/lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.java new file mode 100644 index 000000000000..fd599c232fbd --- /dev/null +++ b/lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.java @@ -0,0 +1,493 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.lucene.util; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.logging.Logger; +import jdk.incubator.vector.ByteVector; +import jdk.incubator.vector.FloatVector; +import jdk.incubator.vector.IntVector; +import jdk.incubator.vector.ShortVector; +import jdk.incubator.vector.Vector; +import jdk.incubator.vector.VectorOperators; +import jdk.incubator.vector.VectorShape; +import jdk.incubator.vector.VectorSpecies; + +/** A VectorUtil provider implementation that leverages the Panama Vector API. */ +final class VectorUtilPanamaProvider implements VectorUtilProvider { + + private static final int INT_SPECIES_PREF_BIT_SIZE = IntVector.SPECIES_PREFERRED.vectorBitSize(); + + private static final VectorSpecies PREF_FLOAT_SPECIES = FloatVector.SPECIES_PREFERRED; + private static final VectorSpecies PREF_BYTE_SPECIES; + private static final VectorSpecies PREF_SHORT_SPECIES; + + /** + * x86 and less than 256-bit vectors. + * + *

it could be that it has only AVX1 and integer vectors are fast. it could also be that it has + * no AVX and integer vectors are extremely slow. don't use integer vectors to avoid landmines. + */ + private static final boolean IS_AMD64_WITHOUT_AVX2 = + Constants.OS_ARCH.equals("amd64") && INT_SPECIES_PREF_BIT_SIZE < 256; + + static { + if (INT_SPECIES_PREF_BIT_SIZE >= 256) { + PREF_BYTE_SPECIES = + ByteVector.SPECIES_MAX.withShape( + VectorShape.forBitSize(IntVector.SPECIES_PREFERRED.vectorBitSize() >> 2)); + PREF_SHORT_SPECIES = + ShortVector.SPECIES_MAX.withShape( + VectorShape.forBitSize(IntVector.SPECIES_PREFERRED.vectorBitSize() >> 1)); + } else { + PREF_BYTE_SPECIES = null; + PREF_SHORT_SPECIES = null; + } + } + + // Extracted to a method to be able to apply the SuppressForbidden annotation + @SuppressWarnings("removal") + @SuppressForbidden(reason = "security manager") + private static T doPrivileged(PrivilegedAction action) { + return AccessController.doPrivileged(action); + } + + VectorUtilPanamaProvider() { + if (INT_SPECIES_PREF_BIT_SIZE < 128) { + throw new UnsupportedOperationException( + "Vector bit size is less than 128: " + INT_SPECIES_PREF_BIT_SIZE); + } + + // hack to work around for JDK-8309727: + try { + doPrivileged( + () -> + FloatVector.fromArray(PREF_FLOAT_SPECIES, new float[PREF_FLOAT_SPECIES.length()], 0)); + } catch (SecurityException se) { + throw new UnsupportedOperationException( + "We hit initialization failure described in JDK-8309727: " + se); + } + + var log = Logger.getLogger(getClass().getName()); + log.info( + "Java vector incubator API enabled; uses preferredBitSize=" + INT_SPECIES_PREF_BIT_SIZE); + } + + @Override + public float dotProduct(float[] a, float[] b) { + int i = 0; + float res = 0; + // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize + if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { + // vector loop is unrolled 4x (4 accumulators in parallel) + FloatVector acc1 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc2 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc3 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc4 = FloatVector.zero(PREF_FLOAT_SPECIES); + int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); + for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + acc1 = acc1.add(va.mul(vb)); + FloatVector vc = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); + FloatVector vd = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); + acc2 = acc2.add(vc.mul(vd)); + FloatVector ve = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); + FloatVector vf = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); + acc3 = acc3.add(ve.mul(vf)); + FloatVector vg = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); + FloatVector vh = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); + acc4 = acc4.add(vg.mul(vh)); + } + // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes + upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); + for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + acc1 = acc1.add(va.mul(vb)); + } + // reduce + FloatVector res1 = acc1.add(acc2); + FloatVector res2 = acc3.add(acc4); + res += res1.add(res2).reduceLanes(VectorOperators.ADD); + } + + for (; i < a.length; i++) { + res += b[i] * a[i]; + } + return res; + } + + @Override + public float cosine(float[] a, float[] b) { + int i = 0; + float sum = 0; + float norm1 = 0; + float norm2 = 0; + // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize + if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { + // vector loop is unrolled 4x (4 accumulators in parallel) + FloatVector sum1 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector sum2 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector sum3 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector sum4 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm1_1 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm1_2 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm1_3 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm1_4 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm2_1 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm2_2 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm2_3 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector norm2_4 = FloatVector.zero(PREF_FLOAT_SPECIES); + int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); + for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + sum1 = sum1.add(va.mul(vb)); + norm1_1 = norm1_1.add(va.mul(va)); + norm2_1 = norm2_1.add(vb.mul(vb)); + FloatVector vc = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); + FloatVector vd = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); + sum2 = sum2.add(vc.mul(vd)); + norm1_2 = norm1_2.add(vc.mul(vc)); + norm2_2 = norm2_2.add(vd.mul(vd)); + FloatVector ve = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); + FloatVector vf = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); + sum3 = sum3.add(ve.mul(vf)); + norm1_3 = norm1_3.add(ve.mul(ve)); + norm2_3 = norm2_3.add(vf.mul(vf)); + FloatVector vg = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); + FloatVector vh = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); + sum4 = sum4.add(vg.mul(vh)); + norm1_4 = norm1_4.add(vg.mul(vg)); + norm2_4 = norm2_4.add(vh.mul(vh)); + } + // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes + upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); + for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + sum1 = sum1.add(va.mul(vb)); + norm1_1 = norm1_1.add(va.mul(va)); + norm2_1 = norm2_1.add(vb.mul(vb)); + } + // reduce + FloatVector sumres1 = sum1.add(sum2); + FloatVector sumres2 = sum3.add(sum4); + FloatVector norm1res1 = norm1_1.add(norm1_2); + FloatVector norm1res2 = norm1_3.add(norm1_4); + FloatVector norm2res1 = norm2_1.add(norm2_2); + FloatVector norm2res2 = norm2_3.add(norm2_4); + sum += sumres1.add(sumres2).reduceLanes(VectorOperators.ADD); + norm1 += norm1res1.add(norm1res2).reduceLanes(VectorOperators.ADD); + norm2 += norm2res1.add(norm2res2).reduceLanes(VectorOperators.ADD); + } + + for (; i < a.length; i++) { + float elem1 = a[i]; + float elem2 = b[i]; + sum += elem1 * elem2; + norm1 += elem1 * elem1; + norm2 += elem2 * elem2; + } + return (float) (sum / Math.sqrt(norm1 * norm2)); + } + + @Override + public float squareDistance(float[] a, float[] b) { + int i = 0; + float res = 0; + // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize + if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { + // vector loop is unrolled 4x (4 accumulators in parallel) + FloatVector acc1 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc2 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc3 = FloatVector.zero(PREF_FLOAT_SPECIES); + FloatVector acc4 = FloatVector.zero(PREF_FLOAT_SPECIES); + int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); + for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + FloatVector diff1 = va.sub(vb); + acc1 = acc1.add(diff1.mul(diff1)); + FloatVector vc = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); + FloatVector vd = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); + FloatVector diff2 = vc.sub(vd); + acc2 = acc2.add(diff2.mul(diff2)); + FloatVector ve = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); + FloatVector vf = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); + FloatVector diff3 = ve.sub(vf); + acc3 = acc3.add(diff3.mul(diff3)); + FloatVector vg = + FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); + FloatVector vh = + FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); + FloatVector diff4 = vg.sub(vh); + acc4 = acc4.add(diff4.mul(diff4)); + } + // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes + upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); + for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { + FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); + FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); + FloatVector diff = va.sub(vb); + acc1 = acc1.add(diff.mul(diff)); + } + // reduce + FloatVector res1 = acc1.add(acc2); + FloatVector res2 = acc3.add(acc4); + res += res1.add(res2).reduceLanes(VectorOperators.ADD); + } + + for (; i < a.length; i++) { + float diff = a[i] - b[i]; + res += diff * diff; + } + return res; + } + + // Binary functions, these all follow a general pattern like this: + // + // short intermediate = a * b; + // int accumulator = accumulator + intermediate; + // + // 256 or 512 bit vectors can process 64 or 128 bits at a time, respectively + // intermediate results use 128 or 256 bit vectors, respectively + // final accumulator uses 256 or 512 bit vectors, respectively + // + // We also support 128 bit vectors, using two 128 bit accumulators. + // This is slower but still faster than not vectorizing at all. + + @Override + public int dotProduct(byte[] a, byte[] b) { + int i = 0; + int res = 0; + // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit + // vectors (256-bit on intel to dodge performance landmines) + if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { + // compute vectorized dot product consistent with VPDPBUSD instruction + if (INT_SPECIES_PREF_BIT_SIZE >= 256) { + // optimized 256/512 bit implementation, processes 8/16 bytes at a time + int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); + IntVector acc = IntVector.zero(IntVector.SPECIES_PREFERRED); + for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { + ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); + ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); + Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector prod16 = va16.mul(vb16); + Vector prod32 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); + acc = acc.add(prod32); + } + // reduce + res += acc.reduceLanes(VectorOperators.ADD); + } else { + // 128-bit implementation, which must "split up" vectors due to widening conversions + int upperBound = ByteVector.SPECIES_64.loopBound(a.length); + IntVector acc1 = IntVector.zero(IntVector.SPECIES_128); + IntVector acc2 = IntVector.zero(IntVector.SPECIES_128); + for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { + ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); + ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); + // expand each byte vector into short vector and multiply + Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector prod16 = va16.mul(vb16); + // split each short vector into two int vectors and add + Vector prod32_1 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); + Vector prod32_2 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); + acc1 = acc1.add(prod32_1); + acc2 = acc2.add(prod32_2); + } + // reduce + res += acc1.add(acc2).reduceLanes(VectorOperators.ADD); + } + } + + for (; i < a.length; i++) { + res += b[i] * a[i]; + } + return res; + } + + @Override + public float cosine(byte[] a, byte[] b) { + int i = 0; + int sum = 0; + int norm1 = 0; + int norm2 = 0; + // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit + // vectors (256-bit on intel to dodge performance landmines) + if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { + if (INT_SPECIES_PREF_BIT_SIZE >= 256) { + // optimized 256/512 bit implementation, processes 8/16 bytes at a time + int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); + IntVector accSum = IntVector.zero(IntVector.SPECIES_PREFERRED); + IntVector accNorm1 = IntVector.zero(IntVector.SPECIES_PREFERRED); + IntVector accNorm2 = IntVector.zero(IntVector.SPECIES_PREFERRED); + for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { + ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); + ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); + Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector prod16 = va16.mul(vb16); + Vector norm1_16 = va16.mul(va16); + Vector norm2_16 = vb16.mul(vb16); + Vector prod32 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); + Vector norm1_32 = + norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); + Vector norm2_32 = + norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); + accSum = accSum.add(prod32); + accNorm1 = accNorm1.add(norm1_32); + accNorm2 = accNorm2.add(norm2_32); + } + // reduce + sum += accSum.reduceLanes(VectorOperators.ADD); + norm1 += accNorm1.reduceLanes(VectorOperators.ADD); + norm2 += accNorm2.reduceLanes(VectorOperators.ADD); + } else { + // 128-bit implementation, which must "split up" vectors due to widening conversions + int upperBound = ByteVector.SPECIES_64.loopBound(a.length); + IntVector accSum1 = IntVector.zero(IntVector.SPECIES_128); + IntVector accSum2 = IntVector.zero(IntVector.SPECIES_128); + IntVector accNorm1_1 = IntVector.zero(IntVector.SPECIES_128); + IntVector accNorm1_2 = IntVector.zero(IntVector.SPECIES_128); + IntVector accNorm2_1 = IntVector.zero(IntVector.SPECIES_128); + IntVector accNorm2_2 = IntVector.zero(IntVector.SPECIES_128); + for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { + ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); + ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); + // expand each byte vector into short vector and perform multiplications + Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector prod16 = va16.mul(vb16); + Vector norm1_16 = va16.mul(va16); + Vector norm2_16 = vb16.mul(vb16); + // split each short vector into two int vectors and add + Vector prod32_1 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); + Vector prod32_2 = + prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); + Vector norm1_32_1 = + norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); + Vector norm1_32_2 = + norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); + Vector norm2_32_1 = + norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); + Vector norm2_32_2 = + norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); + accSum1 = accSum1.add(prod32_1); + accSum2 = accSum2.add(prod32_2); + accNorm1_1 = accNorm1_1.add(norm1_32_1); + accNorm1_2 = accNorm1_2.add(norm1_32_2); + accNorm2_1 = accNorm2_1.add(norm2_32_1); + accNorm2_2 = accNorm2_2.add(norm2_32_2); + } + // reduce + sum += accSum1.add(accSum2).reduceLanes(VectorOperators.ADD); + norm1 += accNorm1_1.add(accNorm1_2).reduceLanes(VectorOperators.ADD); + norm2 += accNorm2_1.add(accNorm2_2).reduceLanes(VectorOperators.ADD); + } + } + + for (; i < a.length; i++) { + byte elem1 = a[i]; + byte elem2 = b[i]; + sum += elem1 * elem2; + norm1 += elem1 * elem1; + norm2 += elem2 * elem2; + } + return (float) (sum / Math.sqrt((double) norm1 * (double) norm2)); + } + + @Override + public int squareDistance(byte[] a, byte[] b) { + int i = 0; + int res = 0; + // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit + // vectors (256-bit on intel to dodge performance landmines) + if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { + if (INT_SPECIES_PREF_BIT_SIZE >= 256) { + // optimized 256/512 bit implementation, processes 8/16 bytes at a time + int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); + IntVector acc = IntVector.zero(IntVector.SPECIES_PREFERRED); + for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { + ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); + ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); + Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); + Vector diff16 = va16.sub(vb16); + Vector diff32 = + diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); + acc = acc.add(diff32.mul(diff32)); + } + // reduce + res += acc.reduceLanes(VectorOperators.ADD); + } else { + // 128-bit implementation, which must "split up" vectors due to widening conversions + int upperBound = ByteVector.SPECIES_64.loopBound(a.length); + IntVector acc1 = IntVector.zero(IntVector.SPECIES_128); + IntVector acc2 = IntVector.zero(IntVector.SPECIES_128); + for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { + ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); + ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); + // expand each byte vector into short vector and subtract + Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); + Vector diff16 = va16.sub(vb16); + // split each short vector into two int vectors, square, and add + Vector diff32_1 = + diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); + Vector diff32_2 = + diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); + acc1 = acc1.add(diff32_1.mul(diff32_1)); + acc2 = acc2.add(diff32_2.mul(diff32_2)); + } + // reduce + res += acc1.add(acc2).reduceLanes(VectorOperators.ADD); + } + } + + for (; i < a.length; i++) { + int diff = a[i] - b[i]; + res += diff * diff; + } + return res; + } +} From 5ad93e19cfcb153ef10bf5ca4ae487f26d095613 Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Mon, 12 Jun 2023 21:25:39 +0100 Subject: [PATCH 2/6] update changes (since all in same minor release) --- lucene/CHANGES.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 1f478e126cc5..379f719a1453 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -139,8 +139,8 @@ New Features * GITHUB#12257: Create OnHeapHnswGraphSearcher to let OnHeapHnswGraph to be searched in a thread-safety manner. (Patrick Zhai) * GITHUB#12302, GITHUB#12311: Add vectorized implementations of VectorUtil.dotProduct(), - squareDistance(), cosine() with Java 20 jdk.incubator.vector APIs. Applications started - with command line parameter "java --add-modules jdk.incubator.vector" on exactly Java 20 + squareDistance(), cosine() with Java 20 or 21 jdk.incubator.vector APIs. Applications started + with command line parameter "java --add-modules jdk.incubator.vector" on exactly Java 20 or 21 will automatically use the new vectorized implementations if running on a supported platform (x86 AVX2 or later, ARM NEON). This is an opt-in feature and requires explicit Java command line flag! When enabled, Lucene logs a notice using java.util.logging. Please test From a4f47a86a4a75105520242563faff22854b92226 Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Tue, 13 Jun 2023 08:43:44 +0100 Subject: [PATCH 3/6] changelog --- lucene/CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 379f719a1453..aaee53837cc2 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -138,7 +138,7 @@ New Features * GITHUB#12257: Create OnHeapHnswGraphSearcher to let OnHeapHnswGraph to be searched in a thread-safety manner. (Patrick Zhai) -* GITHUB#12302, GITHUB#12311: Add vectorized implementations of VectorUtil.dotProduct(), +* GITHUB#12302, GITHUB#12311, GITHUB#12363: Add vectorized implementations of VectorUtil.dotProduct(), squareDistance(), cosine() with Java 20 or 21 jdk.incubator.vector APIs. Applications started with command line parameter "java --add-modules jdk.incubator.vector" on exactly Java 20 or 21 will automatically use the new vectorized implementations if running on a supported platform From 22f2ec8229eeb933bbfd39497237ac8222da59b3 Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Tue, 13 Jun 2023 08:44:52 +0100 Subject: [PATCH 4/6] reverts --- .../extract-jdk-apis/ExtractJdkApis.java | 2 +- lucene/core/src/generated/jdk/jdk21.apijar | Bin 56723 -> 16543 bytes .../lucene/util/VectorUtilPanamaProvider.java | 493 ------------------ 3 files changed, 1 insertion(+), 494 deletions(-) delete mode 100644 lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.java diff --git a/gradle/generation/extract-jdk-apis/ExtractJdkApis.java b/gradle/generation/extract-jdk-apis/ExtractJdkApis.java index 6eaf27127f7d..7121374850bd 100644 --- a/gradle/generation/extract-jdk-apis/ExtractJdkApis.java +++ b/gradle/generation/extract-jdk-apis/ExtractJdkApis.java @@ -56,7 +56,7 @@ public final class ExtractJdkApis { static final Map> CLASSFILE_PATTERNS = Map.of( 19, List.of(PATTERN_PANAMA_FOREIGN), 20, List.of(PATTERN_PANAMA_FOREIGN, PATTERN_VECTOR_VM_INTERNALS, PATTERN_VECTOR_INCUBATOR), - 21, List.of(PATTERN_PANAMA_FOREIGN, PATTERN_VECTOR_VM_INTERNALS, PATTERN_VECTOR_INCUBATOR) + 21, List.of(PATTERN_PANAMA_FOREIGN) ); public static void main(String... args) throws IOException { diff --git a/lucene/core/src/generated/jdk/jdk21.apijar b/lucene/core/src/generated/jdk/jdk21.apijar index 2f3670a9f1275069300b84be0b655788a8d0451a..69906ccf4b06b66820c34c8a899512675d5ff482 100644 GIT binary patch delta 33 ncmbQdn|XdC;|5mq&G$~WaZawk%f=_gAjQze$-uyD&Hw}e(_0Bh delta 39281 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

%{su#NBc2sZp`_8Z~ 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 PREF_FLOAT_SPECIES = FloatVector.SPECIES_PREFERRED; - private static final VectorSpecies PREF_BYTE_SPECIES; - private static final VectorSpecies PREF_SHORT_SPECIES; - - /** - * x86 and less than 256-bit vectors. - * - *

it could be that it has only AVX1 and integer vectors are fast. it could also be that it has - * no AVX and integer vectors are extremely slow. don't use integer vectors to avoid landmines. - */ - private static final boolean IS_AMD64_WITHOUT_AVX2 = - Constants.OS_ARCH.equals("amd64") && INT_SPECIES_PREF_BIT_SIZE < 256; - - static { - if (INT_SPECIES_PREF_BIT_SIZE >= 256) { - PREF_BYTE_SPECIES = - ByteVector.SPECIES_MAX.withShape( - VectorShape.forBitSize(IntVector.SPECIES_PREFERRED.vectorBitSize() >> 2)); - PREF_SHORT_SPECIES = - ShortVector.SPECIES_MAX.withShape( - VectorShape.forBitSize(IntVector.SPECIES_PREFERRED.vectorBitSize() >> 1)); - } else { - PREF_BYTE_SPECIES = null; - PREF_SHORT_SPECIES = null; - } - } - - // Extracted to a method to be able to apply the SuppressForbidden annotation - @SuppressWarnings("removal") - @SuppressForbidden(reason = "security manager") - private static T doPrivileged(PrivilegedAction action) { - return AccessController.doPrivileged(action); - } - - VectorUtilPanamaProvider() { - if (INT_SPECIES_PREF_BIT_SIZE < 128) { - throw new UnsupportedOperationException( - "Vector bit size is less than 128: " + INT_SPECIES_PREF_BIT_SIZE); - } - - // hack to work around for JDK-8309727: - try { - doPrivileged( - () -> - FloatVector.fromArray(PREF_FLOAT_SPECIES, new float[PREF_FLOAT_SPECIES.length()], 0)); - } catch (SecurityException se) { - throw new UnsupportedOperationException( - "We hit initialization failure described in JDK-8309727: " + se); - } - - var log = Logger.getLogger(getClass().getName()); - log.info( - "Java vector incubator API enabled; uses preferredBitSize=" + INT_SPECIES_PREF_BIT_SIZE); - } - - @Override - public float dotProduct(float[] a, float[] b) { - int i = 0; - float res = 0; - // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize - if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { - // vector loop is unrolled 4x (4 accumulators in parallel) - FloatVector acc1 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc2 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc3 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc4 = FloatVector.zero(PREF_FLOAT_SPECIES); - int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); - for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - acc1 = acc1.add(va.mul(vb)); - FloatVector vc = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); - FloatVector vd = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); - acc2 = acc2.add(vc.mul(vd)); - FloatVector ve = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); - FloatVector vf = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); - acc3 = acc3.add(ve.mul(vf)); - FloatVector vg = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); - FloatVector vh = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); - acc4 = acc4.add(vg.mul(vh)); - } - // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes - upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); - for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - acc1 = acc1.add(va.mul(vb)); - } - // reduce - FloatVector res1 = acc1.add(acc2); - FloatVector res2 = acc3.add(acc4); - res += res1.add(res2).reduceLanes(VectorOperators.ADD); - } - - for (; i < a.length; i++) { - res += b[i] * a[i]; - } - return res; - } - - @Override - public float cosine(float[] a, float[] b) { - int i = 0; - float sum = 0; - float norm1 = 0; - float norm2 = 0; - // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize - if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { - // vector loop is unrolled 4x (4 accumulators in parallel) - FloatVector sum1 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector sum2 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector sum3 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector sum4 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm1_1 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm1_2 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm1_3 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm1_4 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm2_1 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm2_2 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm2_3 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector norm2_4 = FloatVector.zero(PREF_FLOAT_SPECIES); - int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); - for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - sum1 = sum1.add(va.mul(vb)); - norm1_1 = norm1_1.add(va.mul(va)); - norm2_1 = norm2_1.add(vb.mul(vb)); - FloatVector vc = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); - FloatVector vd = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); - sum2 = sum2.add(vc.mul(vd)); - norm1_2 = norm1_2.add(vc.mul(vc)); - norm2_2 = norm2_2.add(vd.mul(vd)); - FloatVector ve = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); - FloatVector vf = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); - sum3 = sum3.add(ve.mul(vf)); - norm1_3 = norm1_3.add(ve.mul(ve)); - norm2_3 = norm2_3.add(vf.mul(vf)); - FloatVector vg = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); - FloatVector vh = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); - sum4 = sum4.add(vg.mul(vh)); - norm1_4 = norm1_4.add(vg.mul(vg)); - norm2_4 = norm2_4.add(vh.mul(vh)); - } - // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes - upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); - for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - sum1 = sum1.add(va.mul(vb)); - norm1_1 = norm1_1.add(va.mul(va)); - norm2_1 = norm2_1.add(vb.mul(vb)); - } - // reduce - FloatVector sumres1 = sum1.add(sum2); - FloatVector sumres2 = sum3.add(sum4); - FloatVector norm1res1 = norm1_1.add(norm1_2); - FloatVector norm1res2 = norm1_3.add(norm1_4); - FloatVector norm2res1 = norm2_1.add(norm2_2); - FloatVector norm2res2 = norm2_3.add(norm2_4); - sum += sumres1.add(sumres2).reduceLanes(VectorOperators.ADD); - norm1 += norm1res1.add(norm1res2).reduceLanes(VectorOperators.ADD); - norm2 += norm2res1.add(norm2res2).reduceLanes(VectorOperators.ADD); - } - - for (; i < a.length; i++) { - float elem1 = a[i]; - float elem2 = b[i]; - sum += elem1 * elem2; - norm1 += elem1 * elem1; - norm2 += elem2 * elem2; - } - return (float) (sum / Math.sqrt(norm1 * norm2)); - } - - @Override - public float squareDistance(float[] a, float[] b) { - int i = 0; - float res = 0; - // if the array size is large (> 2x platform vector size), its worth the overhead to vectorize - if (a.length > 2 * PREF_FLOAT_SPECIES.length()) { - // vector loop is unrolled 4x (4 accumulators in parallel) - FloatVector acc1 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc2 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc3 = FloatVector.zero(PREF_FLOAT_SPECIES); - FloatVector acc4 = FloatVector.zero(PREF_FLOAT_SPECIES); - int upperBound = PREF_FLOAT_SPECIES.loopBound(a.length - 3 * PREF_FLOAT_SPECIES.length()); - for (; i < upperBound; i += 4 * PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - FloatVector diff1 = va.sub(vb); - acc1 = acc1.add(diff1.mul(diff1)); - FloatVector vc = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + PREF_FLOAT_SPECIES.length()); - FloatVector vd = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + PREF_FLOAT_SPECIES.length()); - FloatVector diff2 = vc.sub(vd); - acc2 = acc2.add(diff2.mul(diff2)); - FloatVector ve = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 2 * PREF_FLOAT_SPECIES.length()); - FloatVector vf = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 2 * PREF_FLOAT_SPECIES.length()); - FloatVector diff3 = ve.sub(vf); - acc3 = acc3.add(diff3.mul(diff3)); - FloatVector vg = - FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i + 3 * PREF_FLOAT_SPECIES.length()); - FloatVector vh = - FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i + 3 * PREF_FLOAT_SPECIES.length()); - FloatVector diff4 = vg.sub(vh); - acc4 = acc4.add(diff4.mul(diff4)); - } - // vector tail: less scalar computations for unaligned sizes, esp with big vector sizes - upperBound = PREF_FLOAT_SPECIES.loopBound(a.length); - for (; i < upperBound; i += PREF_FLOAT_SPECIES.length()) { - FloatVector va = FloatVector.fromArray(PREF_FLOAT_SPECIES, a, i); - FloatVector vb = FloatVector.fromArray(PREF_FLOAT_SPECIES, b, i); - FloatVector diff = va.sub(vb); - acc1 = acc1.add(diff.mul(diff)); - } - // reduce - FloatVector res1 = acc1.add(acc2); - FloatVector res2 = acc3.add(acc4); - res += res1.add(res2).reduceLanes(VectorOperators.ADD); - } - - for (; i < a.length; i++) { - float diff = a[i] - b[i]; - res += diff * diff; - } - return res; - } - - // Binary functions, these all follow a general pattern like this: - // - // short intermediate = a * b; - // int accumulator = accumulator + intermediate; - // - // 256 or 512 bit vectors can process 64 or 128 bits at a time, respectively - // intermediate results use 128 or 256 bit vectors, respectively - // final accumulator uses 256 or 512 bit vectors, respectively - // - // We also support 128 bit vectors, using two 128 bit accumulators. - // This is slower but still faster than not vectorizing at all. - - @Override - public int dotProduct(byte[] a, byte[] b) { - int i = 0; - int res = 0; - // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit - // vectors (256-bit on intel to dodge performance landmines) - if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { - // compute vectorized dot product consistent with VPDPBUSD instruction - if (INT_SPECIES_PREF_BIT_SIZE >= 256) { - // optimized 256/512 bit implementation, processes 8/16 bytes at a time - int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); - IntVector acc = IntVector.zero(IntVector.SPECIES_PREFERRED); - for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { - ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); - ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); - Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector prod16 = va16.mul(vb16); - Vector prod32 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); - acc = acc.add(prod32); - } - // reduce - res += acc.reduceLanes(VectorOperators.ADD); - } else { - // 128-bit implementation, which must "split up" vectors due to widening conversions - int upperBound = ByteVector.SPECIES_64.loopBound(a.length); - IntVector acc1 = IntVector.zero(IntVector.SPECIES_128); - IntVector acc2 = IntVector.zero(IntVector.SPECIES_128); - for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { - ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); - ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); - // expand each byte vector into short vector and multiply - Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector prod16 = va16.mul(vb16); - // split each short vector into two int vectors and add - Vector prod32_1 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); - Vector prod32_2 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); - acc1 = acc1.add(prod32_1); - acc2 = acc2.add(prod32_2); - } - // reduce - res += acc1.add(acc2).reduceLanes(VectorOperators.ADD); - } - } - - for (; i < a.length; i++) { - res += b[i] * a[i]; - } - return res; - } - - @Override - public float cosine(byte[] a, byte[] b) { - int i = 0; - int sum = 0; - int norm1 = 0; - int norm2 = 0; - // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit - // vectors (256-bit on intel to dodge performance landmines) - if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { - if (INT_SPECIES_PREF_BIT_SIZE >= 256) { - // optimized 256/512 bit implementation, processes 8/16 bytes at a time - int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); - IntVector accSum = IntVector.zero(IntVector.SPECIES_PREFERRED); - IntVector accNorm1 = IntVector.zero(IntVector.SPECIES_PREFERRED); - IntVector accNorm2 = IntVector.zero(IntVector.SPECIES_PREFERRED); - for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { - ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); - ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); - Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector prod16 = va16.mul(vb16); - Vector norm1_16 = va16.mul(va16); - Vector norm2_16 = vb16.mul(vb16); - Vector prod32 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); - Vector norm1_32 = - norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); - Vector norm2_32 = - norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); - accSum = accSum.add(prod32); - accNorm1 = accNorm1.add(norm1_32); - accNorm2 = accNorm2.add(norm2_32); - } - // reduce - sum += accSum.reduceLanes(VectorOperators.ADD); - norm1 += accNorm1.reduceLanes(VectorOperators.ADD); - norm2 += accNorm2.reduceLanes(VectorOperators.ADD); - } else { - // 128-bit implementation, which must "split up" vectors due to widening conversions - int upperBound = ByteVector.SPECIES_64.loopBound(a.length); - IntVector accSum1 = IntVector.zero(IntVector.SPECIES_128); - IntVector accSum2 = IntVector.zero(IntVector.SPECIES_128); - IntVector accNorm1_1 = IntVector.zero(IntVector.SPECIES_128); - IntVector accNorm1_2 = IntVector.zero(IntVector.SPECIES_128); - IntVector accNorm2_1 = IntVector.zero(IntVector.SPECIES_128); - IntVector accNorm2_2 = IntVector.zero(IntVector.SPECIES_128); - for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { - ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); - ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); - // expand each byte vector into short vector and perform multiplications - Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector prod16 = va16.mul(vb16); - Vector norm1_16 = va16.mul(va16); - Vector norm2_16 = vb16.mul(vb16); - // split each short vector into two int vectors and add - Vector prod32_1 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); - Vector prod32_2 = - prod16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); - Vector norm1_32_1 = - norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); - Vector norm1_32_2 = - norm1_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); - Vector norm2_32_1 = - norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); - Vector norm2_32_2 = - norm2_16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); - accSum1 = accSum1.add(prod32_1); - accSum2 = accSum2.add(prod32_2); - accNorm1_1 = accNorm1_1.add(norm1_32_1); - accNorm1_2 = accNorm1_2.add(norm1_32_2); - accNorm2_1 = accNorm2_1.add(norm2_32_1); - accNorm2_2 = accNorm2_2.add(norm2_32_2); - } - // reduce - sum += accSum1.add(accSum2).reduceLanes(VectorOperators.ADD); - norm1 += accNorm1_1.add(accNorm1_2).reduceLanes(VectorOperators.ADD); - norm2 += accNorm2_1.add(accNorm2_2).reduceLanes(VectorOperators.ADD); - } - } - - for (; i < a.length; i++) { - byte elem1 = a[i]; - byte elem2 = b[i]; - sum += elem1 * elem2; - norm1 += elem1 * elem1; - norm2 += elem2 * elem2; - } - return (float) (sum / Math.sqrt((double) norm1 * (double) norm2)); - } - - @Override - public int squareDistance(byte[] a, byte[] b) { - int i = 0; - int res = 0; - // only vectorize if we'll at least enter the loop a single time, and we have at least 128-bit - // vectors (256-bit on intel to dodge performance landmines) - if (a.length >= 16 && IS_AMD64_WITHOUT_AVX2 == false) { - if (INT_SPECIES_PREF_BIT_SIZE >= 256) { - // optimized 256/512 bit implementation, processes 8/16 bytes at a time - int upperBound = PREF_BYTE_SPECIES.loopBound(a.length); - IntVector acc = IntVector.zero(IntVector.SPECIES_PREFERRED); - for (; i < upperBound; i += PREF_BYTE_SPECIES.length()) { - ByteVector va8 = ByteVector.fromArray(PREF_BYTE_SPECIES, a, i); - ByteVector vb8 = ByteVector.fromArray(PREF_BYTE_SPECIES, b, i); - Vector va16 = va8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, PREF_SHORT_SPECIES, 0); - Vector diff16 = va16.sub(vb16); - Vector diff32 = - diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_PREFERRED, 0); - acc = acc.add(diff32.mul(diff32)); - } - // reduce - res += acc.reduceLanes(VectorOperators.ADD); - } else { - // 128-bit implementation, which must "split up" vectors due to widening conversions - int upperBound = ByteVector.SPECIES_64.loopBound(a.length); - IntVector acc1 = IntVector.zero(IntVector.SPECIES_128); - IntVector acc2 = IntVector.zero(IntVector.SPECIES_128); - for (; i < upperBound; i += ByteVector.SPECIES_64.length()) { - ByteVector va8 = ByteVector.fromArray(ByteVector.SPECIES_64, a, i); - ByteVector vb8 = ByteVector.fromArray(ByteVector.SPECIES_64, b, i); - // expand each byte vector into short vector and subtract - Vector va16 = va8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector vb16 = vb8.convertShape(VectorOperators.B2S, ShortVector.SPECIES_128, 0); - Vector diff16 = va16.sub(vb16); - // split each short vector into two int vectors, square, and add - Vector diff32_1 = - diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 0); - Vector diff32_2 = - diff16.convertShape(VectorOperators.S2I, IntVector.SPECIES_128, 1); - acc1 = acc1.add(diff32_1.mul(diff32_1)); - acc2 = acc2.add(diff32_2.mul(diff32_2)); - } - // reduce - res += acc1.add(acc2).reduceLanes(VectorOperators.ADD); - } - } - - for (; i < a.length; i++) { - int diff = a[i] - b[i]; - res += diff * diff; - } - return res; - } -} From 4eafc9f97ded6b4236ca8477516cf042d16e446f Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Tue, 13 Jun 2023 08:45:03 +0100 Subject: [PATCH 5/6] add readme --- lucene/core/src/java21/org/apache/lucene/util/README.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 lucene/core/src/java21/org/apache/lucene/util/README.txt diff --git a/lucene/core/src/java21/org/apache/lucene/util/README.txt b/lucene/core/src/java21/org/apache/lucene/util/README.txt new file mode 100644 index 000000000000..db75951206ef --- /dev/null +++ b/lucene/core/src/java21/org/apache/lucene/util/README.txt @@ -0,0 +1,2 @@ +The version of VectorUtilPanamaProvider for Java 21 is identical to that of Java 20. +As such, there is no specific 21 version - the Java 20 version will be loaded from the MRJAR. \ No newline at end of file From b25c8b003131c2ad555a164bc077e648c3d94d39 Mon Sep 17 00:00:00 2001 From: ChrisHegarty Date: Tue, 13 Jun 2023 09:28:08 +0100 Subject: [PATCH 6/6] rename txt file --- .../lucene/util/{README.txt => VectorUtilPanamaProvider.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lucene/core/src/java21/org/apache/lucene/util/{README.txt => VectorUtilPanamaProvider.txt} (100%) diff --git a/lucene/core/src/java21/org/apache/lucene/util/README.txt b/lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.txt similarity index 100% rename from lucene/core/src/java21/org/apache/lucene/util/README.txt rename to lucene/core/src/java21/org/apache/lucene/util/VectorUtilPanamaProvider.txt