如何在 Java 中使用英特尔 AVX?更新:

2022-09-02 04:18:21

如何使用 Java 中的英特尔 AVX 矢量指令集?这是一个简单的问题,但答案似乎很难找到。


答案 1

据我所知,目前大多数Java JVM JITters不支持自动矢量化,或者只是为非常简单的循环这样做,所以你运气不好。

在Mono的.NET实现中,有手动矢量代码发射,然后后来的MS引入了.不幸的是,在Java中没有类似的东西。我不知道Java的向量类是否使用SIMD进行矢量化,但我认为不是。Mono.SimdSystem.Numeric.Vectors

如果你想使用像AVX这样的CPU特定功能,那么你唯一的选择就是JNI。用C或C++写下你的瓶颈部分,并从Java调用它

Scala还有另一种解决方案,可以在不修改JVM的情况下使用矢量化代码,您可以在我们如何使JVM速度提高40倍中阅读。


更新:

现在有一个新的Vector API正在开发,用于手动编写矢量代码。

提供孵化器模块 jdk.incubator.vector 的初始迭代,以表示在运行时可靠地编译为支持的 CPU 架构上的最佳矢量硬件指令的矢量计算,从而实现优于等效标量计算的性能。

https://openjdk.java.net/jeps/338


阅读更多:


答案 2

根据工作的不同,您可能不必做太多事情。AVX2由JVM在Arrays和String上的某些操作上自动使用,在支持平台(如Haswell和Xeon v3)上。

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

从Ryzen 3 / Epyc Rome,您还可以在AMD处理器上拥有单周期AVX2:https://www.anandtech.com/print/14525/amd-zen-2-microarchitecture-analysis-ryzen-3000-and-epyc-rome

但是,直接使用指令和内部函数并不容易获得。


推荐