如何在Java中使用Intel AVX?
如何使用Java中的英特尔AVX矢量指令集?这是一个简单的问题,但答案似乎很难找到。正如我所知,大多数当前Java JVM不支持自动矢量化,或者只支持非常简单的循环,所以你运气不好 在Mono的.NET实现中,有用于手动矢量代码生成的如何在Java中使用Intel AVX?,java,simd,avx,Java,Simd,Avx,如何使用Java中的英特尔AVX矢量指令集?这是一个简单的问题,但答案似乎很难找到。正如我所知,大多数当前Java JVM不支持自动矢量化,或者只支持非常简单的循环,所以你运气不好 在Mono的.NET实现中,有用于手动矢量代码生成的Mono.Simd,随后MS引入了System.Numeric.Vectors。不幸的是,Java中没有类似的东西。我不知道Java的向量类是否使用SIMD进行了向量化,但我认为不是 如果您想使用特定于CPU的特性,比如AVX,那么您唯一的选择就是JNI。在C或C+
Mono.Simd
,随后MS引入了System.Numeric.Vectors
。不幸的是,Java中没有类似的东西。我不知道Java的向量类是否使用SIMD进行了向量化,但我认为不是
如果您想使用特定于CPU的特性,比如AVX,那么您唯一的选择就是JNI。在C或C++中编写你的瓶颈部分,并从java 调用它
Scala的另一个解决方案是使用矢量化代码,而不修改可以读入的JVM
更新: 现在有一个新的矢量API正在开发中,用于手动编写矢量代码 提供孵化器模块jdk.incubator.vector的初始迭代,以表示在运行时可靠编译为支持的CPU体系结构上的最佳向量硬件指令的向量计算,从而实现优于等效标量计算的性能
阅读更多:
另一个选择是使用JNI调用一个使用AVX本质的C++函数,或者由编译器自动矢量化。< /P> < P>检查YEPP库。 它有java绑定和非常快速的跨平台SIMD库
根据工作的不同,你可能不需要做很多事情。AVX2由JVM在支持平台(如Haswell Forwards和Xeon v3 Forwards)上对数组和字符串的某些操作自动使用 从Ryzen 3/Epyc Rome,您还可以在AMD处理器上使用单周期AVX2:
不过,直接使用说明和内部函数并不容易。您到底想实现什么?你能澄清一下你的问题吗?我想使用AVX而不是Java int数组执行按位AND和XOR计算。可能重复:相关关键字是SIMD这似乎是一组特殊用途的例程,而不是用于向量运算的通用工具包。我遗漏了什么吗?@AleksandrDubinsky对于一个通用API,我会使用JavaCL,它也是OpenCL的包装器。上述链接已经失效。检查更新:JEP-338于2018年2月21日以java 16交付@软件工程师