用于矢量化计算的Java最佳实践

时间:2016-12-27 17:05:47

标签: java blas nd4j

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

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

我的问题是:

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



我希望这个问题既可以帮助那些开发自己的计算程序的人,也可以帮助那些只想在不同实现之间做出明智选择的人。

我们非常感谢您的见解!

1 个答案:

答案 0 :(得分:5)

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

  1. 可能要求您不允许在目标系统中安装特定的本机库,并且尚未安装BLAS。在这种情况下,您只需使用Java库。
  2. 对于长度远小于100的数组,纯Java库往往表现更好,之后在某些时候,通过JNI使用本机库可以获得更好的性能。与往常一样,您的里程可能会有所不同。
  3. 已经执行了相关的基准测试(按随机顺序):

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

    This answer有一个相当最新的列表,除了它没有提到相当新的nd4j。请记住,jeigen取决于本征,因此不取决于BLAS。