如何使用Java中的Intel AVX向量指令集?这是一个简单的问题,但答案似乎很难找到。
据我所知,大多数当前的Java JVM JITter不支持自动向量化,或者仅支持非常简单的循环,因此您很不走运。
在Mono的.NET实现中,有Mono.Simd
用于手动矢量代码发射,然后后来MS引入了System.Numeric.Vectors
。不幸的是,Java中没有类似的东西。我不知道Java的向量类是否使用SIMD进行向量化,但我认为不是。
如果要使用特定于CPU的功能(例如AVX),则唯一的选择是JNI。用C或C ++编写瓶颈部分,然后从Java调用它]
Scala的另一种解决方案是使用矢量化代码而不修改您可以在How we made the JVM 40x faster中读取的JVM
现在正在开发一种新的Vector API,用于手动编写矢量代码
提供孵化器模块jdk.incubator.vector的初始迭代,以表达向量计算,该向量计算在运行时可靠地编译为支持的CPU架构上的最佳向量硬件指令,从而获得优于同等标量计算的性能。
阅读更多:
要从Java使用这些操作,您需要一个JavaCV之类的库。此库可对Intel处理器和GPU(如NVIDIA)启用矢量操作。
根据工作,您可能不必做很多事情。 JVM在支持Haswell和Xeon v3等平台的阵列和String上的某些操作上自动使用AVX2。
一种选择是使用Aparapi并安装Intel OpenCL驱动程序。 (只要安装了适当的OpenCL驱动程序,您的代码就会被向量化以在CPU和GPU上都可以使用。)
检查yeppp库。它具有Java绑定及其非常快速的跨平台SIMD库。