【问题标题】:Java best practices for vectorized computations矢量化计算的 Java 最佳实践
【发布时间】:2017-05-11 23:30:50
【问题描述】:

我正在研究用 Java 计算昂贵的向量运算的方法,例如大矩阵之间的点积或乘法。这里有一些关于这个主题的好帖子,比如thisthis

似乎没有可靠的方法让 JIT 编译代码以使用 CPU 向量指令(SSE2、AVX、MMX...)。此外,高性能线性代数库(ND4J、jblas、...)实际上确实对核心例程的 BLAS/LAPACK 库进行了 JNI 调用。而且我理解 BLAS/LAPACK 包是原生线性代数计算的事实上标准选择。
另一方面,其他人(JAMA,...)在没有 native 调用的情况下使用纯 Java 实现算法。

我的问题是:

  • 这里有哪些最佳做法?
  • 对 BLAS/LAPACK 进行native 调用实际上是推荐的选择吗?还有其他值得考虑的库吗?
  • 与性能提升相比,JNI 调用的开销是否可以忽略不计?有没有人知道阈值在哪里(例如,输入应该多小才能使 JNI 调用比纯 Java 例程更昂贵?)
  • 便携性权衡有多大?



我希望这个问题对那些开发自己的计算例程的人以及那些只想在不同实现之间做出有根据的选择的人都有帮助。

感谢您的见解!

【问题讨论】:

    标签: java blas nd4j


    【解决方案1】:

    没有针对每种情况的明确最佳做法。您是否可以/应该通过 JNI 使用纯 Java 解决方案(不使用 SIMD 指令)或(使用 SIMD 优化)本机代码取决于您的特定应用程序,特别是您的数组大小以及对目标系统的可能限制。

    1. 可能要求您不允许在目标系统中安装特定的本机库,并且尚未安装 BLAS。在这种情况下,您只需使用 Java 库即可。
    2. 对于长度远小于 100 的数组,纯 Java 库的性能往往会更好,之后通过 JNI 使用本机库可以获得更好的性能。与往常一样,您的里程可能会有所不同。

    已执行相关基准测试(以随机顺序):

    这些基准可能会令人困惑,因为它们提供了丰富的信息。一个库对于某些操作可能更快,而对于其他一些操作则较慢。另请记住,您的系统可能有不止一种 BLAS 实现。我目前在我的系统 blas、atlas 和 openblas 上安装了 3 个。除了选择包装 BLAS 实现的 Java 库外,您还必须选择底层 BLAS 实现。

    This answer 有一个相当新的列表,只是它没有提到相当新的 nd4j。请记住,jeigen 取决于 eigen,而不是 BLAS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2012-03-03
      • 2015-07-02
      • 2011-06-01
      相关资源
      最近更新 更多