如何使用Java的Intel i7 Vector处理器(AVX)?这是一个简单的问题,但答案似乎很难找到。
答案 0 :(得分:2)
据我所知,目前大多数Java JVM JIT都不支持自动矢量化,也不支持非常简单的循环,所以你运气不好。
在Mono的.NET实现中,Mono.Simd
用于手动矢量代码发射,但在Java中没有类似的东西。我不知道Java的vector类是否使用SIMD进行矢量化,但我认为不是。
如果您想使用像AVX这样的CPU特定功能,那么您唯一的选择就是JNI。用C或C ++编写瓶颈部分并从Java中调用它
更多信息:
答案 1 :(得分:1)
要在Java中使用这些操作,您需要一个像JavaCV这样的库。此库可以为英特尔处理器和GPU(如NVIDIA)启用矢量操作。
答案 2 :(得分:1)
根据工作,您可能不必做很多事情。 JVM在支持Haswell和Xeon v3等平台的阵列和String上的某些操作上自动使用AVX2。
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
直接使用指令和内在函数并不容易。
答案 3 :(得分:0)
一种选择是使用Aparapi并安装Intel OpenCL驱动程序。 (只要安装了适当的OpenCL驱动程序,您的代码就会被矢量化,以便在CPU和GPU上运行。)
另一个选择是使用JNI并调用使用AVX内在函数的C ++函数或由编译器自动向量化。
答案 4 :(得分:0)
检查yeppp库。 它有java绑定和非常快速的跨平台SIMD库。