How to use the Intel AVX in Java?
Depending on the work, you may not have to do much. AVX2 is used automatically by JVM on some operations on Arrays and String, on supporting platforms like Haswell onwards and Xeon v3 onwards.
https://software.intel.com/en-us/articles/java-application-performance-improvement-with-intel-xeon-processor-e7-v3
https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX2
From Ryzen 3 / Epyc Rome, you'll also have single cycle AVX2 on AMD processors: https://www.anandtech.com/print/14525/amd-zen-2-microarchitecture-analysis-ryzen-3000-and-epyc-rome
Direct use of the instructions and intrinsics are not easily available though.
As I know, most current Java JVM JITters don't support automatic vectorization or just do that for very simple loops, so you're out of luck.
In Mono's .NET implementation there's Mono.Simd
for manual vector code emission and then later MS introduced the System.Numeric.Vectors
. Unfortunately there's nothing similar in Java. I don't know if Java's vector class is vectorized using SIMD or not but I don't think it is.
If you want to use CPU-specific features like AVX then your only choice is JNI. Write your bottle neck part in C or C++ and call it from Java
There's another solution by Scala to use vectorized code without modifying the JVM that you can read in How we made the JVM 40x faster
Update:
Now there's a new Vector API being developed for writing vector code manually
Provide an initial iteration of an incubator module, jdk.incubator.vector, to express vector computations that reliably compile at runtime to optimal vector hardware instructions on supported CPU architectures and thus achieve superior performance to equivalent scalar computations.
https://openjdk.java.net/jeps/338
- Vector API Developer Program for Java* Software
- Oracle and Intel seek to build a Java API for SIMD support
Read more:
- Do any JVM's JIT compilers generate code that uses vectorized floating point instructions?
- SIMD Vectors/Matrices in Java?
- What is the state of auto-vectorization in OpenJDK?
- Vectorized Algorithms in Java
Java 19 now supports SIMD with new Vector Intrinsics API , this API much faster then JNI implementations. Its directly converting your java method calls to inline assembly instructions. Checkout : https://vksegfault.github.io/posts/java-simd/
To use these operations from Java you need a library like JavaCV This library enables vector operations for both Intel Processors and GPUs like NVIDIA.