如何在Java中使用英特尔AVX技术?

22

我该如何从Java中使用Intel AVX向量指令集?这是一个简单的问题,但答案似乎很难找到。


你到底想要实现什么?你能澄清一下你的问题吗? - Mureinik
我想使用AVX而不是Java int数组执行按位AND和XOR计算。 - Albert Hendriks
可能是重复问题:https://dev59.com/F2gv5IYBdhLWcg3wMN4U - Samuel Audet
一个相关的关键词是SIMD。 - Software Engineer
6个回答

17
据我所知,大多数当前的Java JVM JIT编译器不支持自动向量化,或者只支持非常简单的循环。所以你只能凭运气了。
在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* Software的向量API开发人员计划 - Oracle和Intel寻求为SIMD支持构建Java API - 有哪个JVM的JIT编译器生成使用向量浮点指令的代码吗?
  • Java中的SIMD向量/矩阵?
  • OpenJDK中自动向量化的状态是什么?
  • 在Java中进行向量化算法

  • 7
    更新:JEP-338已于2021年2月18日在Java 16中发布。@SoftwareEngineer - Goofy

    4

    根据工作的不同,您可能不需要做太多工作。在支持平台上(例如Haswell及其以后版本和Xeon v3及其以后版本),JVM会自动在某些数组和字符串操作中使用AVX2。

    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 但是,直接使用指令和内部函数并不容易。

    3

    1

    要从Java中使用这些操作,您需要像JavaCV这样的库。该库可以为Intel处理器和NVIDIA等GPU启用向量操作。


    1
    这似乎是一组特定用途的例程,而不是一个用于向量操作的通用工具包。我是否遗漏了什么? - Aleksandr Dubinsky
    对于通用API,我会使用JavaCL,它也是OpenCL的包装器。@AleksandrDubinsky - Peter Lawrey

    0
    检查 yeppp 库。它有 Java 绑定,并且是一个非常快速的跨平台 SIMD 库。

    http://www.yeppp.info


    以上链接已失效。请查看https://sites.google.com/site/yeppplibrary/。 - phuclv

    0

    一种选择是使用Aparapi并安装Intel OpenCL驱动程序。(只要安装了适当的OpenCL驱动程序,您的代码将被矢量化以在CPU和GPU上运行。)

    另一种选择是使用JNI并调用使用AVX内部函数或由编译器自动矢量化的C++函数。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接