我正在研究用Java计算昂贵的向量运算的方法,例如点积或大矩阵之间的乘法.关于这个主题,这里有一些好的主题,比如这个和这个.
似乎没有可靠的方法让JIT编译代码使用CPU向量指令(SSE2,AVX,MMX ......).此外,高性能线性代数库(ND4J,jblas,...)实际上对核心例程进行了对BLAS/LAPACK库的JNI调用.我理解BLAS/LAPACK包是本机线性代数计算的事实上的标准选择.
另一方面,其他人(JAMA,...)在没有native调用的情况下在纯Java中实现算法.
我的问题是:
native对BLAS/LAPACK实际上是一个推荐选择电话?还有其他值得考虑的图书馆吗?
我希望这个问题既可以帮助那些开发自己的计算程序的人,也可以帮助那些只想在不同实现之间做出明智选择的人.
深刻见解!
每个案例都没有明确的最佳做法.是否可以/应该使用纯Java解决方案(不使用SIMD指令)或(使用SIMD优化)本机代码通过JNI取决于您的特定应用程序,特别是阵列的大小和对目标系统的可能限制.
已执行相关基准测试(按随机顺序):
这些基准可能令人困惑,因为它们提供了丰富的信息.对于某些操作,一个库可能更快,而对于其他操作则更慢.另请注意,您的系统可能有多个BLAS实现可用.我目前在我的系统blas,atlas和openblas上安装了3个.除了选择包装BLAS实现的Java库之外,还必须选择基础BLAS实现.
这个答案有一个相当新的列表,除了它没有提到相当新的nd4j.请记住,jeigen取决于本征,因此不取决于BLAS.
| 归档时间: |
|
| 查看次数: |
1581 次 |
| 最近记录: |