【问题标题】:How to use the Intel AVX in Java?如何在 Java 中使用英特尔 AVX?
【发布时间】:2015-02-24 06:49:04
【问题描述】:

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

【问题讨论】:

  • 您到底想达到什么目的?你能澄清你的问题吗?
  • 我想使用 AVX 而不是 Java int 数组执行按位 AND 和 XOR 计算。
  • 一个相关的关键字是 SIMD

标签: java simd avx


【解决方案1】:

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

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

如果您想使用 AVX 等特定于 CPU 的功能,那么您唯一的选择就是 JNI。用 C 或 C++ 编写你的瓶颈部分并从 Java 中调用它

Scala 提供了另一种解决方案,可以在不修改 JVM 的情况下使用矢量化代码,您可以在 How we made the JVM 40x faster 中阅读该解决方案


更新:

现在正在开发新的 Vector API,用于手动编写矢量代码

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

https://openjdk.java.net/jeps/338


阅读更多:

【讨论】:

  • 更新:JEP-338 于 2021 年 2 月 18 日在 java 16 中交付。 @SoftwareEngineer
【解决方案2】:

根据工作的不同,您可能不需要做太多事情。 AVX2 被 JVM 自动用于数组和字符串的某些操作,支持的平台如 Haswell 和 Xeon v3 及更高版本。

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】:

    要在 Java 中使用这些操作,您需要像 JavaCV 这样的库。该库支持英特尔处理器和 NVIDIA 等 GPU 的矢量操作。

    【讨论】:

    • 这似乎是专用例程的集合,而不是用于矢量运算的通用工具包。我错过了什么吗?
    • @AleksandrDubinsky 对于通用 API 我会使用 JavaCL,它也是 OpenCL 的包装器。 .
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      检查 yeppp 库。 它具有 java 绑定及其非常快速的跨平台 SIMD 库。

      http://www.yeppp.info

      【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2020-03-21
      • 2021-09-17
      • 1970-01-01
      • 2011-02-12
      • 2018-05-09
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多