我正在研究在Java中计算昂贵的向量运算的方法,例如点积或大矩阵之间的乘法。在这个主题上有一些很好的线索,比如this和this。
似乎没有可靠的方法让JIT编译代码使用CPU向量指令(SSE2、AVX、MMX.)。此外,高性能线性代数库(ND4J,jblas,.)实际上,可以为核心例程对BLAS/LAPACK库进行JNI调用。我认为BLAS/LAPACK包是本地线性代数计算的事实上的标准选择。
另一方面(JAMA,.)在没有native调用的情况下用纯Java实现算法。
我的问题是:
native调用实际上是推荐的选择吗?还有其他图书馆值得考虑吗?我希望这个问题对那些开发自己的计算例程的人和那些只想在不同的实现之间做出有教养的选择的人都有帮助。
洞察力是值得欣赏的!
发布于 2016-12-27 17:48:53
没有针对每一个案例的明确的最佳做法。您是否可以/应该使用纯Java解决方案(不使用SIMD指令)或(使用SIMD优化)本机代码(通过JNI进行优化)取决于您的特定应用程序,特别是您的数组的大小以及对目标系统的可能限制。
已执行了相关基准(按随机顺序排列):
这些基准可能会令人困惑,因为它们信息丰富。一个库对于某些操作可能更快,对于另一些操作可能更慢。还请记住,您的系统可能有一个以上的BLAS实现。目前,我已经在我的系统中安装了3台blas、地图集和openblas。除了选择包装BLAS实现的Java库之外,您还必须选择底层的BLAS实现。
This answer有一个最新的列表,只是它没有提到相当新的nd4j。记住,杰根依赖于艾根,而不是布拉斯。
https://stackoverflow.com/questions/41349224
复制相似问题