首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矢量化计算的Java最佳实践

矢量化计算的Java最佳实践
EN

Stack Overflow用户
提问于 2016-12-27 17:05:46
回答 1查看 2.9K关注 0票数 6

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

似乎没有可靠的方法让JIT编译代码使用CPU向量指令(SSE2、AVX、MMX.)。此外,高性能线性代数库(ND4J,jblas,.)实际上,可以为核心例程对BLAS/LAPACK库进行JNI调用。我认为BLAS/LAPACK包是本地线性代数计算的事实上的标准选择。

另一方面(JAMA,.)在没有native调用的情况下用纯Java实现算法。

我的问题是:

  • 这里的最佳实践是什么?
  • 对BLAS/LAPACK进行native调用实际上是推荐的选择吗?还有其他图书馆值得考虑吗?
  • 与性能增益相比,JNI调用的开销可以忽略不计吗?是否有人有经验知道阈值在哪里(例如,一个输入应该有多小才能使JNI调用比纯Java例程更昂贵?)
  • 可移植性的权衡有多大?

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

洞察力是值得欣赏的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-27 17:48:53

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

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

已执行了相关基准(按随机顺序排列):

这些基准可能会令人困惑,因为它们信息丰富。一个库对于某些操作可能更快,对于另一些操作可能更慢。还请记住,您的系统可能有一个以上的BLAS实现。目前,我已经在我的系统中安装了3台blas、地图集和openblas。除了选择包装BLAS实现的Java库之外,您还必须选择底层的BLAS实现。

This answer有一个最新的列表,只是它没有提到相当新的nd4j。记住,杰根依赖于艾根,而不是布拉斯。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41349224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档