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