我正在研究在 Java 中计算昂贵的向量运算的方法,例如大矩阵之间的点积或乘法。这里有一些关于这个主题的好帖子,比如this和this。
似乎没有可靠的方法让 JIT 编译代码以使用 CPU 向量指令(SSE2、AVX、MMX ...)。此外,高性能线性代数库(ND4J、jblas、...)实际上确实对核心例程的 BLAS/LAPACK 库进行了 JNI 调用。而且我理解 BLAS/LAPACK 包是本地线性代数计算的事实上的标准选择。
另一方面,其他人(JAMA,...)无需native
调用即可在纯 Java 中实现算法。
我的问题是:
- 这里有哪些最佳实践?
native
打电话给 BLAS/LAPACK 实际上是一个推荐的选择吗?还有其他值得考虑的库吗?- 与性能提升相比,JNI 调用的开销是否可以忽略不计?有没有人知道阈值在哪里(例如,输入应该多小才能使 JNI 调用比纯 Java 例程更昂贵?)
- 便携性的权衡有多大?
我希望这个问题对那些开发自己的计算例程的人以及那些只想在不同实现之间做出明智选择的人都有帮助。
见解表示赞赏!