Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用Intel AVX?_Java_Simd_Avx - Fatal编程技术网

如何在Java中使用Intel AVX?

如何在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+

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

正如我所知,大多数当前Java JVM不支持自动矢量化,或者只支持非常简单的循环,所以你运气不好

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

如果您想使用特定于CPU的特性,比如AVX,那么您唯一的选择就是JNI。在C或C++中编写你的瓶颈部分,并从java

调用它 Scala的另一个解决方案是使用矢量化代码,而不修改可以读入的JVM


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

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


阅读更多:


要从Java使用这些操作,您需要一个类似于此库的库,该库为Intel处理器和GPU(如NVIDIA)启用向量操作。

一个选项是使用并安装Intel OpenCL驱动程序。(只要安装了合适的OpenCL驱动程序,您的代码将被矢量化以在CPU和GPU上工作。)

另一个选择是使用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交付@软件工程师