uschindler commented on a change in pull request #18: URL: https://github.com/apache/lucene/pull/18#discussion_r594943346
########## File path: lucene/core/src/java/org/apache/lucene/util/VectorUtil.java ########## @@ -17,16 +17,123 @@ package org.apache.lucene.util; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Base64; + /** Utilities for computations with numeric arrays */ public final class VectorUtil { private VectorUtil() {} + // org.apache.lucene.util.VectorUtilSIMD#dotProduct(float[], float[]) + private static final String SIMD_BASE64 = + "yv66vgAAADwAbQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClW\n" + + "BwAIAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbhIAAAAKDAALAAwBABdtYWtl\n" + + "Q29uY2F0V2l0aENvbnN0YW50cwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAAcADgwABQAPAQAV\n" + + "KExqYXZhL2xhbmcvU3RyaW5nOylWCQARABIHABMMABQAFQEAJW9yZy9hcGFjaGUvbHVjZW5lL3V0\n" + + "aWwvVmVjdG9yVXRpbFNJTUQBAAdTUEVDSUVTAQAkTGpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rv\n" + + "clNwZWNpZXM7CwAXABgHABkMABoAGwEAImpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3RvclNwZWNp\n" + + "ZXMBAAZsZW5ndGgBAAMoKUkKAB0AHgcAHwwAIAAhAQAgamRrL2luY3ViYXRvci92ZWN0b3IvRmxv\n" + + "YXRWZWN0b3IBAAR6ZXJvAQBIKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0b3JTcGVjaWVzOylM\n" + + "amRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CwAXACMMACQAJQEACWxvb3BCb3VuZAEA\n" + + "BChJKUkKAB0AJwwAKAApAQAJZnJvbUFycmF5AQBLKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0\n" + + "b3JTcGVjaWVzO1tGSSlMamRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CgAdACsMACwA\n" + + "LQEAA211bAEAQShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yOylMamRrL2luY3ViYXRvci92\n" + + "ZWN0b3IvRmxvYXRWZWN0b3I7CgAdAC8MADAALQEAA2FkZAkAMgAzBwA0DAA1ADYBACRqZGsvaW5j\n" + + "dWJhdG9yL3ZlY3Rvci9WZWN0b3JPcGVyYXRvcnMBAANBREQBADJMamRrL2luY3ViYXRvci92ZWN0\n" + + "b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOwoAHQA4DAA5ADoBAAtyZWR1Y2VMYW5lcwEA\n" + + "NShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOylGCQAd\n" + + "ADwMAD0AFQEAEVNQRUNJRVNfUFJFRkVSUkVEAQAJU2lnbmF0dXJlAQA3TGpkay9pbmN1YmF0b3Iv\n" + + "dmVjdG9yL1ZlY3RvclNwZWNpZXM8TGphdmEvbGFuZy9GbG9hdDs+OwEABENvZGUBAA9MaW5lTnVt\n" + + "YmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAnTG9yZy9hcGFjaGUvbHVjZW5l\n" + + "L3V0aWwvVmVjdG9yVXRpbFNJTUQ7AQAKZG90UHJvZHVjdAEAByhbRltGKUYBAAJ2YQEAIkxqZGsv\n" + + "aW5jdWJhdG9yL3ZlY3Rvci9GbG9hdFZlY3RvcjsBAAJ2YgEAAnZjAQACdmQBAARhY2MxAQAEYWNj\n" + + "MgEACnVwcGVyQm91bmQBAAFJAQABYQEAAltGAQABYgEAAWkBAANyZXMBAAFGAQANU3RhY2tNYXBU\n" + + "YWJsZQcAUQEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEAE1ZlY3RvclV0aWxTSU1ELmphdmEBABBC\n" + + "b290c3RyYXBNZXRob2RzDwYAXQoAXgBfBwBgDAALAGEBACRqYXZhL2xhbmcvaW52b2tlL1N0cmlu\n" + + "Z0NvbmNhdEZhY3RvcnkBAJgoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7\n" + + "TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTtMamF2YS9sYW5n\n" + + "L1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlOwgA\n" + + "YwEAHnZlY3RvciBkaW1lbnNpb25zIGRpZmZlcjogASE9AQEADElubmVyQ2xhc3NlcwcAZgEAMGpk\n" + + "ay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rvck9wZXJhdG9ycyRBc3NvY2lhdGl2ZQEAC0Fzc29jaWF0\n" + + "aXZlBwBpAQAlamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExvb2t1cAcAawEAHmphdmEv\n" + + "bGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcwEABkxvb2t1cAAhABEAAgAAAAEAGgAUABUAAQA+AAAA\n" + + "AgA/AAMAAQAFAAYAAQBAAAAALwABAAEAAAAFKrcAAbEAAAACAEEAAAAGAAEAAAAZAEIAAAAMAAEA\n" + + "AAAFAEMARAAAAAkARQBGAAEAQAAAAewABAALAAAA6Cq+K76fABS7AAdZKr4rvroACQAAtwANvwM9\n" + + "C0YqvgWyABC5ABYBAGihAKiyABC4ABw6BLIAELgAHDoFsgAQKr6yABC5ABYBAGS5ACICADYGHBUG\n" + + "ogBpsgAQKhy4ACY6B7IAECscuAAmOggZBBkHGQi2ACq2AC46BLIAECocsgAQuQAWAQBguAAmOgmy\n" + + "ABArHLIAELkAFgEAYLgAJjoKGQUZCRkKtgAqtgAuOgUcBbIAELkAFgEAaGA9p/+XJRkEsgAxtgA3\n" + + "GQWyADG2ADdiYkYcKr6iABMlKxwwKhwwamJGhAIBp//tJa4AAAADAEEAAABWABUAAAAhAAcAIgAY\n" + + "ACQAGgAlABwAKAArACkAMwAqADsAKwBQACwAVgAtAGAALgBqAC8AeAAwAIsAMQCeADIArAAsALwA\n" + + "NADQADYA1gA3AOAANgDmADkAQgAAAHAACwBgAEwARwBIAAcAagBCAEkASAAIAIsAIQBKAEgACQCe\n" + + "AA4ASwBIAAoAMwCdAEwASAAEADsAlQBNAEgABQBQAIAATgBPAAYAAADoAFAAUQAAAAAA6ABSAFEA\n" + + "AQAaAM4AUwBPAAIAHADMAFQAVQADAFYAAAAgAAUY/wA3AAcHAFcHAFcBAgcAHQcAHQEAAPsAa/gA\n" + + "ExUACABYAAYAAQBAAAAAHwABAAAAAAAHsgA7swAQsQAAAAEAQQAAAAYAAQAAABoAAwBZAAAAAgBa\n" + + "AFsAAAAIAAEAXAABAGIAZAAAABIAAgBlADIAZwYJAGgAagBsABk="; + + private static final MethodHandle DOTPRODUCT; + private static final MethodType DOTPRODUCT_TYPE = + MethodType.methodType(float.class, float[].class, float[].class); + + static final class Loader extends ClassLoader { + Loader(ClassLoader parent) { + super(parent); + } + + public Class<?> define(byte[] code) { Review comment: this signature is strange as it takes the bytes, but not the class name. Either take class name, too, or alternatively decode pass the base64 directly here: `Base64.getMimeDecoder().decode(SIMD_BASE64)`, so method gets parameterless. Ideally (as we are on Java 16), we could have used the new anonymous classes. But this code is also not visible, damn! ########## File path: lucene/core/src/java/org/apache/lucene/util/VectorUtil.java ########## @@ -17,16 +17,123 @@ package org.apache.lucene.util; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Base64; + /** Utilities for computations with numeric arrays */ public final class VectorUtil { private VectorUtil() {} + // org.apache.lucene.util.VectorUtilSIMD#dotProduct(float[], float[]) + private static final String SIMD_BASE64 = + "yv66vgAAADwAbQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClW\n" + + "BwAIAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbhIAAAAKDAALAAwBABdtYWtl\n" + + "Q29uY2F0V2l0aENvbnN0YW50cwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAAcADgwABQAPAQAV\n" + + "KExqYXZhL2xhbmcvU3RyaW5nOylWCQARABIHABMMABQAFQEAJW9yZy9hcGFjaGUvbHVjZW5lL3V0\n" + + "aWwvVmVjdG9yVXRpbFNJTUQBAAdTUEVDSUVTAQAkTGpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rv\n" + + "clNwZWNpZXM7CwAXABgHABkMABoAGwEAImpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3RvclNwZWNp\n" + + "ZXMBAAZsZW5ndGgBAAMoKUkKAB0AHgcAHwwAIAAhAQAgamRrL2luY3ViYXRvci92ZWN0b3IvRmxv\n" + + "YXRWZWN0b3IBAAR6ZXJvAQBIKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0b3JTcGVjaWVzOylM\n" + + "amRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CwAXACMMACQAJQEACWxvb3BCb3VuZAEA\n" + + "BChJKUkKAB0AJwwAKAApAQAJZnJvbUFycmF5AQBLKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0\n" + + "b3JTcGVjaWVzO1tGSSlMamRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CgAdACsMACwA\n" + + "LQEAA211bAEAQShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yOylMamRrL2luY3ViYXRvci92\n" + + "ZWN0b3IvRmxvYXRWZWN0b3I7CgAdAC8MADAALQEAA2FkZAkAMgAzBwA0DAA1ADYBACRqZGsvaW5j\n" + + "dWJhdG9yL3ZlY3Rvci9WZWN0b3JPcGVyYXRvcnMBAANBREQBADJMamRrL2luY3ViYXRvci92ZWN0\n" + + "b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOwoAHQA4DAA5ADoBAAtyZWR1Y2VMYW5lcwEA\n" + + "NShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOylGCQAd\n" + + "ADwMAD0AFQEAEVNQRUNJRVNfUFJFRkVSUkVEAQAJU2lnbmF0dXJlAQA3TGpkay9pbmN1YmF0b3Iv\n" + + "dmVjdG9yL1ZlY3RvclNwZWNpZXM8TGphdmEvbGFuZy9GbG9hdDs+OwEABENvZGUBAA9MaW5lTnVt\n" + + "YmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAnTG9yZy9hcGFjaGUvbHVjZW5l\n" + + "L3V0aWwvVmVjdG9yVXRpbFNJTUQ7AQAKZG90UHJvZHVjdAEAByhbRltGKUYBAAJ2YQEAIkxqZGsv\n" + + "aW5jdWJhdG9yL3ZlY3Rvci9GbG9hdFZlY3RvcjsBAAJ2YgEAAnZjAQACdmQBAARhY2MxAQAEYWNj\n" + + "MgEACnVwcGVyQm91bmQBAAFJAQABYQEAAltGAQABYgEAAWkBAANyZXMBAAFGAQANU3RhY2tNYXBU\n" + + "YWJsZQcAUQEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEAE1ZlY3RvclV0aWxTSU1ELmphdmEBABBC\n" + + "b290c3RyYXBNZXRob2RzDwYAXQoAXgBfBwBgDAALAGEBACRqYXZhL2xhbmcvaW52b2tlL1N0cmlu\n" + + "Z0NvbmNhdEZhY3RvcnkBAJgoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7\n" + + "TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTtMamF2YS9sYW5n\n" + + "L1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlOwgA\n" + + "YwEAHnZlY3RvciBkaW1lbnNpb25zIGRpZmZlcjogASE9AQEADElubmVyQ2xhc3NlcwcAZgEAMGpk\n" + + "ay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rvck9wZXJhdG9ycyRBc3NvY2lhdGl2ZQEAC0Fzc29jaWF0\n" + + "aXZlBwBpAQAlamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExvb2t1cAcAawEAHmphdmEv\n" + + "bGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcwEABkxvb2t1cAAhABEAAgAAAAEAGgAUABUAAQA+AAAA\n" + + "AgA/AAMAAQAFAAYAAQBAAAAALwABAAEAAAAFKrcAAbEAAAACAEEAAAAGAAEAAAAZAEIAAAAMAAEA\n" + + "AAAFAEMARAAAAAkARQBGAAEAQAAAAewABAALAAAA6Cq+K76fABS7AAdZKr4rvroACQAAtwANvwM9\n" + + "C0YqvgWyABC5ABYBAGihAKiyABC4ABw6BLIAELgAHDoFsgAQKr6yABC5ABYBAGS5ACICADYGHBUG\n" + + "ogBpsgAQKhy4ACY6B7IAECscuAAmOggZBBkHGQi2ACq2AC46BLIAECocsgAQuQAWAQBguAAmOgmy\n" + + "ABArHLIAELkAFgEAYLgAJjoKGQUZCRkKtgAqtgAuOgUcBbIAELkAFgEAaGA9p/+XJRkEsgAxtgA3\n" + + "GQWyADG2ADdiYkYcKr6iABMlKxwwKhwwamJGhAIBp//tJa4AAAADAEEAAABWABUAAAAhAAcAIgAY\n" + + "ACQAGgAlABwAKAArACkAMwAqADsAKwBQACwAVgAtAGAALgBqAC8AeAAwAIsAMQCeADIArAAsALwA\n" + + "NADQADYA1gA3AOAANgDmADkAQgAAAHAACwBgAEwARwBIAAcAagBCAEkASAAIAIsAIQBKAEgACQCe\n" + + "AA4ASwBIAAoAMwCdAEwASAAEADsAlQBNAEgABQBQAIAATgBPAAYAAADoAFAAUQAAAAAA6ABSAFEA\n" + + "AQAaAM4AUwBPAAIAHADMAFQAVQADAFYAAAAgAAUY/wA3AAcHAFcHAFcBAgcAHQcAHQEAAPsAa/gA\n" + + "ExUACABYAAYAAQBAAAAAHwABAAAAAAAHsgA7swAQsQAAAAEAQQAAAAYAAQAAABoAAwBZAAAAAgBa\n" + + "AFsAAAAIAAEAXAABAGIAZAAAABIAAgBlADIAZwYJAGgAagBsABk="; + + private static final MethodHandle DOTPRODUCT; + private static final MethodType DOTPRODUCT_TYPE = + MethodType.methodType(float.class, float[].class, float[].class); + + static final class Loader extends ClassLoader { + Loader(ClassLoader parent) { + super(parent); + } + + public Class<?> define(byte[] code) { + return defineClass("org.apache.lucene.util.VectorUtilSIMD", code, 0, code.length); + } + } + + /** + * True if vectorized dot product is supported. + * + * <p>For this to work, you need java 16, and you need to opt-in by passing {@code --add-modules + * jdk.incubator.vector} to the java command line. + */ + public static final boolean DOTPRODUCT_VECTORIZATION_SUPPORTED; + + static { + MethodHandle impl = null; + boolean vectorSupported = false; + + try { + impl = + MethodHandles.lookup().findStatic(VectorUtil.class, "dotProductScalar", DOTPRODUCT_TYPE); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new RuntimeException(e); + } + + try { + Class<?> clazz = + new Loader(VectorUtil.class.getClassLoader()) + .define(Base64.getMimeDecoder().decode(SIMD_BASE64)); + impl = MethodHandles.lookup().findStatic(clazz, "dotProduct", DOTPRODUCT_TYPE); + vectorSupported = true; + } catch (Throwable e) { + } + + DOTPRODUCT = impl; + DOTPRODUCT_VECTORIZATION_SUPPORTED = vectorSupported; + } + /** * Returns the vector dot product of the two vectors. IllegalArgumentException is thrown if the * vectors' dimensions differ. */ public static float dotProduct(float[] a, float[] b) { + try { + return (float) DOTPRODUCT.invokeExact(a, b); + } catch (RuntimeException e) { + throw e; + } catch (Throwable e) { Review comment: I'd add another catch with `Error`. ########## File path: lucene/core/src/java/org/apache/lucene/util/VectorUtil.java ########## @@ -17,16 +17,123 @@ package org.apache.lucene.util; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Base64; + /** Utilities for computations with numeric arrays */ public final class VectorUtil { private VectorUtil() {} + // org.apache.lucene.util.VectorUtilSIMD#dotProduct(float[], float[]) + private static final String SIMD_BASE64 = + "yv66vgAAADwAbQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClW\n" + + "BwAIAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbhIAAAAKDAALAAwBABdtYWtl\n" + + "Q29uY2F0V2l0aENvbnN0YW50cwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAAcADgwABQAPAQAV\n" + + "KExqYXZhL2xhbmcvU3RyaW5nOylWCQARABIHABMMABQAFQEAJW9yZy9hcGFjaGUvbHVjZW5lL3V0\n" + + "aWwvVmVjdG9yVXRpbFNJTUQBAAdTUEVDSUVTAQAkTGpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rv\n" + + "clNwZWNpZXM7CwAXABgHABkMABoAGwEAImpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3RvclNwZWNp\n" + + "ZXMBAAZsZW5ndGgBAAMoKUkKAB0AHgcAHwwAIAAhAQAgamRrL2luY3ViYXRvci92ZWN0b3IvRmxv\n" + + "YXRWZWN0b3IBAAR6ZXJvAQBIKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0b3JTcGVjaWVzOylM\n" + + "amRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CwAXACMMACQAJQEACWxvb3BCb3VuZAEA\n" + + "BChJKUkKAB0AJwwAKAApAQAJZnJvbUFycmF5AQBLKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0\n" + + "b3JTcGVjaWVzO1tGSSlMamRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CgAdACsMACwA\n" + + "LQEAA211bAEAQShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yOylMamRrL2luY3ViYXRvci92\n" + + "ZWN0b3IvRmxvYXRWZWN0b3I7CgAdAC8MADAALQEAA2FkZAkAMgAzBwA0DAA1ADYBACRqZGsvaW5j\n" + + "dWJhdG9yL3ZlY3Rvci9WZWN0b3JPcGVyYXRvcnMBAANBREQBADJMamRrL2luY3ViYXRvci92ZWN0\n" + + "b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOwoAHQA4DAA5ADoBAAtyZWR1Y2VMYW5lcwEA\n" + + "NShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOylGCQAd\n" + + "ADwMAD0AFQEAEVNQRUNJRVNfUFJFRkVSUkVEAQAJU2lnbmF0dXJlAQA3TGpkay9pbmN1YmF0b3Iv\n" + + "dmVjdG9yL1ZlY3RvclNwZWNpZXM8TGphdmEvbGFuZy9GbG9hdDs+OwEABENvZGUBAA9MaW5lTnVt\n" + + "YmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAnTG9yZy9hcGFjaGUvbHVjZW5l\n" + + "L3V0aWwvVmVjdG9yVXRpbFNJTUQ7AQAKZG90UHJvZHVjdAEAByhbRltGKUYBAAJ2YQEAIkxqZGsv\n" + + "aW5jdWJhdG9yL3ZlY3Rvci9GbG9hdFZlY3RvcjsBAAJ2YgEAAnZjAQACdmQBAARhY2MxAQAEYWNj\n" + + "MgEACnVwcGVyQm91bmQBAAFJAQABYQEAAltGAQABYgEAAWkBAANyZXMBAAFGAQANU3RhY2tNYXBU\n" + + "YWJsZQcAUQEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEAE1ZlY3RvclV0aWxTSU1ELmphdmEBABBC\n" + + "b290c3RyYXBNZXRob2RzDwYAXQoAXgBfBwBgDAALAGEBACRqYXZhL2xhbmcvaW52b2tlL1N0cmlu\n" + + "Z0NvbmNhdEZhY3RvcnkBAJgoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7\n" + + "TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTtMamF2YS9sYW5n\n" + + "L1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlOwgA\n" + + "YwEAHnZlY3RvciBkaW1lbnNpb25zIGRpZmZlcjogASE9AQEADElubmVyQ2xhc3NlcwcAZgEAMGpk\n" + + "ay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rvck9wZXJhdG9ycyRBc3NvY2lhdGl2ZQEAC0Fzc29jaWF0\n" + + "aXZlBwBpAQAlamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExvb2t1cAcAawEAHmphdmEv\n" + + "bGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcwEABkxvb2t1cAAhABEAAgAAAAEAGgAUABUAAQA+AAAA\n" + + "AgA/AAMAAQAFAAYAAQBAAAAALwABAAEAAAAFKrcAAbEAAAACAEEAAAAGAAEAAAAZAEIAAAAMAAEA\n" + + "AAAFAEMARAAAAAkARQBGAAEAQAAAAewABAALAAAA6Cq+K76fABS7AAdZKr4rvroACQAAtwANvwM9\n" + + "C0YqvgWyABC5ABYBAGihAKiyABC4ABw6BLIAELgAHDoFsgAQKr6yABC5ABYBAGS5ACICADYGHBUG\n" + + "ogBpsgAQKhy4ACY6B7IAECscuAAmOggZBBkHGQi2ACq2AC46BLIAECocsgAQuQAWAQBguAAmOgmy\n" + + "ABArHLIAELkAFgEAYLgAJjoKGQUZCRkKtgAqtgAuOgUcBbIAELkAFgEAaGA9p/+XJRkEsgAxtgA3\n" + + "GQWyADG2ADdiYkYcKr6iABMlKxwwKhwwamJGhAIBp//tJa4AAAADAEEAAABWABUAAAAhAAcAIgAY\n" + + "ACQAGgAlABwAKAArACkAMwAqADsAKwBQACwAVgAtAGAALgBqAC8AeAAwAIsAMQCeADIArAAsALwA\n" + + "NADQADYA1gA3AOAANgDmADkAQgAAAHAACwBgAEwARwBIAAcAagBCAEkASAAIAIsAIQBKAEgACQCe\n" + + "AA4ASwBIAAoAMwCdAEwASAAEADsAlQBNAEgABQBQAIAATgBPAAYAAADoAFAAUQAAAAAA6ABSAFEA\n" + + "AQAaAM4AUwBPAAIAHADMAFQAVQADAFYAAAAgAAUY/wA3AAcHAFcHAFcBAgcAHQcAHQEAAPsAa/gA\n" + + "ExUACABYAAYAAQBAAAAAHwABAAAAAAAHsgA7swAQsQAAAAEAQQAAAAYAAQAAABoAAwBZAAAAAgBa\n" + + "AFsAAAAIAAEAXAABAGIAZAAAABIAAgBlADIAZwYJAGgAagBsABk="; + + private static final MethodHandle DOTPRODUCT; + private static final MethodType DOTPRODUCT_TYPE = + MethodType.methodType(float.class, float[].class, float[].class); + + static final class Loader extends ClassLoader { + Loader(ClassLoader parent) { + super(parent); + } + + public Class<?> define(byte[] code) { + return defineClass("org.apache.lucene.util.VectorUtilSIMD", code, 0, code.length); + } + } + + /** + * True if vectorized dot product is supported. + * + * <p>For this to work, you need java 16, and you need to opt-in by passing {@code --add-modules + * jdk.incubator.vector} to the java command line. + */ + public static final boolean DOTPRODUCT_VECTORIZATION_SUPPORTED; + + static { + MethodHandle impl = null; + boolean vectorSupported = false; + + try { + impl = + MethodHandles.lookup().findStatic(VectorUtil.class, "dotProductScalar", DOTPRODUCT_TYPE); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new RuntimeException(e); + } + + try { + Class<?> clazz = + new Loader(VectorUtil.class.getClassLoader()) + .define(Base64.getMimeDecoder().decode(SIMD_BASE64)); + impl = MethodHandles.lookup().findStatic(clazz, "dotProduct", DOTPRODUCT_TYPE); Review comment: Move `MethodHandles.lookup()` to top of static block, as we need it multiple times. ########## File path: lucene/core/src/java/org/apache/lucene/util/VectorUtil.java ########## @@ -17,16 +17,123 @@ package org.apache.lucene.util; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Base64; + /** Utilities for computations with numeric arrays */ public final class VectorUtil { private VectorUtil() {} + // org.apache.lucene.util.VectorUtilSIMD#dotProduct(float[], float[]) + private static final String SIMD_BASE64 = + "yv66vgAAADwAbQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClW\n" + + "BwAIAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbhIAAAAKDAALAAwBABdtYWtl\n" + + "Q29uY2F0V2l0aENvbnN0YW50cwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsKAAcADgwABQAPAQAV\n" + + "KExqYXZhL2xhbmcvU3RyaW5nOylWCQARABIHABMMABQAFQEAJW9yZy9hcGFjaGUvbHVjZW5lL3V0\n" + + "aWwvVmVjdG9yVXRpbFNJTUQBAAdTUEVDSUVTAQAkTGpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rv\n" + + "clNwZWNpZXM7CwAXABgHABkMABoAGwEAImpkay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3RvclNwZWNp\n" + + "ZXMBAAZsZW5ndGgBAAMoKUkKAB0AHgcAHwwAIAAhAQAgamRrL2luY3ViYXRvci92ZWN0b3IvRmxv\n" + + "YXRWZWN0b3IBAAR6ZXJvAQBIKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0b3JTcGVjaWVzOylM\n" + + "amRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CwAXACMMACQAJQEACWxvb3BCb3VuZAEA\n" + + "BChJKUkKAB0AJwwAKAApAQAJZnJvbUFycmF5AQBLKExqZGsvaW5jdWJhdG9yL3ZlY3Rvci9WZWN0\n" + + "b3JTcGVjaWVzO1tGSSlMamRrL2luY3ViYXRvci92ZWN0b3IvRmxvYXRWZWN0b3I7CgAdACsMACwA\n" + + "LQEAA211bAEAQShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yOylMamRrL2luY3ViYXRvci92\n" + + "ZWN0b3IvRmxvYXRWZWN0b3I7CgAdAC8MADAALQEAA2FkZAkAMgAzBwA0DAA1ADYBACRqZGsvaW5j\n" + + "dWJhdG9yL3ZlY3Rvci9WZWN0b3JPcGVyYXRvcnMBAANBREQBADJMamRrL2luY3ViYXRvci92ZWN0\n" + + "b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOwoAHQA4DAA5ADoBAAtyZWR1Y2VMYW5lcwEA\n" + + "NShMamRrL2luY3ViYXRvci92ZWN0b3IvVmVjdG9yT3BlcmF0b3JzJEFzc29jaWF0aXZlOylGCQAd\n" + + "ADwMAD0AFQEAEVNQRUNJRVNfUFJFRkVSUkVEAQAJU2lnbmF0dXJlAQA3TGpkay9pbmN1YmF0b3Iv\n" + + "dmVjdG9yL1ZlY3RvclNwZWNpZXM8TGphdmEvbGFuZy9GbG9hdDs+OwEABENvZGUBAA9MaW5lTnVt\n" + + "YmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAnTG9yZy9hcGFjaGUvbHVjZW5l\n" + + "L3V0aWwvVmVjdG9yVXRpbFNJTUQ7AQAKZG90UHJvZHVjdAEAByhbRltGKUYBAAJ2YQEAIkxqZGsv\n" + + "aW5jdWJhdG9yL3ZlY3Rvci9GbG9hdFZlY3RvcjsBAAJ2YgEAAnZjAQACdmQBAARhY2MxAQAEYWNj\n" + + "MgEACnVwcGVyQm91bmQBAAFJAQABYQEAAltGAQABYgEAAWkBAANyZXMBAAFGAQANU3RhY2tNYXBU\n" + + "YWJsZQcAUQEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEAE1ZlY3RvclV0aWxTSU1ELmphdmEBABBC\n" + + "b290c3RyYXBNZXRob2RzDwYAXQoAXgBfBwBgDAALAGEBACRqYXZhL2xhbmcvaW52b2tlL1N0cmlu\n" + + "Z0NvbmNhdEZhY3RvcnkBAJgoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcyRMb29rdXA7\n" + + "TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTtMamF2YS9sYW5n\n" + + "L1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlOwgA\n" + + "YwEAHnZlY3RvciBkaW1lbnNpb25zIGRpZmZlcjogASE9AQEADElubmVyQ2xhc3NlcwcAZgEAMGpk\n" + + "ay9pbmN1YmF0b3IvdmVjdG9yL1ZlY3Rvck9wZXJhdG9ycyRBc3NvY2lhdGl2ZQEAC0Fzc29jaWF0\n" + + "aXZlBwBpAQAlamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExvb2t1cAcAawEAHmphdmEv\n" + + "bGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcwEABkxvb2t1cAAhABEAAgAAAAEAGgAUABUAAQA+AAAA\n" + + "AgA/AAMAAQAFAAYAAQBAAAAALwABAAEAAAAFKrcAAbEAAAACAEEAAAAGAAEAAAAZAEIAAAAMAAEA\n" + + "AAAFAEMARAAAAAkARQBGAAEAQAAAAewABAALAAAA6Cq+K76fABS7AAdZKr4rvroACQAAtwANvwM9\n" + + "C0YqvgWyABC5ABYBAGihAKiyABC4ABw6BLIAELgAHDoFsgAQKr6yABC5ABYBAGS5ACICADYGHBUG\n" + + "ogBpsgAQKhy4ACY6B7IAECscuAAmOggZBBkHGQi2ACq2AC46BLIAECocsgAQuQAWAQBguAAmOgmy\n" + + "ABArHLIAELkAFgEAYLgAJjoKGQUZCRkKtgAqtgAuOgUcBbIAELkAFgEAaGA9p/+XJRkEsgAxtgA3\n" + + "GQWyADG2ADdiYkYcKr6iABMlKxwwKhwwamJGhAIBp//tJa4AAAADAEEAAABWABUAAAAhAAcAIgAY\n" + + "ACQAGgAlABwAKAArACkAMwAqADsAKwBQACwAVgAtAGAALgBqAC8AeAAwAIsAMQCeADIArAAsALwA\n" + + "NADQADYA1gA3AOAANgDmADkAQgAAAHAACwBgAEwARwBIAAcAagBCAEkASAAIAIsAIQBKAEgACQCe\n" + + "AA4ASwBIAAoAMwCdAEwASAAEADsAlQBNAEgABQBQAIAATgBPAAYAAADoAFAAUQAAAAAA6ABSAFEA\n" + + "AQAaAM4AUwBPAAIAHADMAFQAVQADAFYAAAAgAAUY/wA3AAcHAFcHAFcBAgcAHQcAHQEAAPsAa/gA\n" + + "ExUACABYAAYAAQBAAAAAHwABAAAAAAAHsgA7swAQsQAAAAEAQQAAAAYAAQAAABoAAwBZAAAAAgBa\n" + + "AFsAAAAIAAEAXAABAGIAZAAAABIAAgBlADIAZwYJAGgAagBsABk="; + + private static final MethodHandle DOTPRODUCT; + private static final MethodType DOTPRODUCT_TYPE = + MethodType.methodType(float.class, float[].class, float[].class); + + static final class Loader extends ClassLoader { + Loader(ClassLoader parent) { + super(parent); + } + + public Class<?> define(byte[] code) { + return defineClass("org.apache.lucene.util.VectorUtilSIMD", code, 0, code.length); + } + } + + /** + * True if vectorized dot product is supported. + * + * <p>For this to work, you need java 16, and you need to opt-in by passing {@code --add-modules + * jdk.incubator.vector} to the java command line. + */ + public static final boolean DOTPRODUCT_VECTORIZATION_SUPPORTED; + + static { + MethodHandle impl = null; + boolean vectorSupported = false; + + try { + impl = + MethodHandles.lookup().findStatic(VectorUtil.class, "dotProductScalar", DOTPRODUCT_TYPE); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new RuntimeException(e); + } + + try { + Class<?> clazz = Review comment: It's safe, because we catch Throwable. To be safe, maybe add AccessController around it. But the necessity for this requires more investigation, I am sure Robert checked this. :-) I think, we don't need extra permissions, as we only work in same java package. The code here is copypasted from Expressions module. ########## File path: lucene/core/src/java/org/apache/lucene/util/VectorUtil.java ########## @@ -17,16 +17,123 @@ package org.apache.lucene.util; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.Base64; + /** Utilities for computations with numeric arrays */ public final class VectorUtil { private VectorUtil() {} + // org.apache.lucene.util.VectorUtilSIMD#dotProduct(float[], float[]) + private static final String SIMD_BASE64 = + "yv66vgAAADwAbQoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClW\n" Review comment: I think we should have the source code of this class file available for regeneration. So anybody can compile with Java 11, but regeneration is only possible with exact Java 16 version. As it currently looks like I would not be sure if we can release this. If we don't add the original source code as a java file for regeneration, we should add source code here. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org