6

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

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

我的问题是:

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



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

见解表示赞赏!

4

1 回答 1

5

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

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

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

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

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

于 2016-12-27T17:48:53.627 回答