用于Java的MKL加速数学库

用于Java的MKL加速数学库,java,linux,math,intel-mkl,Java,Linux,Math,Intel Mkl,我查看了StackOverflow上的相关线程,并用谷歌搜索了一下,但运气不太好。我对Java也很陌生(我来自C#和.NET背景),所以请耐心听我说。Java世界中有太多可用的东西了,简直让人不知所措 我正在开始一个新的Java on Linux项目,该项目需要一些繁重且高度重复的数值计算(即统计、FFT、线性代数、矩阵等)。因此,最大化数学运算的性能是一项要求,确保数学正确也是一项要求。因此,我有兴趣寻找一个Java库,该库可能利用了MKL等本机加速,并且经过验证(因此这里肯定有商业选项) 在

我查看了StackOverflow上的相关线程,并用谷歌搜索了一下,但运气不太好。我对Java也很陌生(我来自C#和.NET背景),所以请耐心听我说。Java世界中有太多可用的东西了,简直让人不知所措

我正在开始一个新的Java on Linux项目,该项目需要一些繁重且高度重复的数值计算(即统计、FFT、线性代数、矩阵等)。因此,最大化数学运算的性能是一项要求,确保数学正确也是一项要求。因此,我有兴趣寻找一个Java库,该库可能利用了MKL等本机加速,并且经过验证(因此这里肯定有商业选项)

在.NET空间中,有高度优化和MKL加速的商业数学库,如Centerspace NMath和Extreme Optimization。Java有什么可比的吗

我发现的大多数Java数学库要么没有得到积极维护(如Colt),要么似乎没有利用MKL或其他本机加速(如Apache Commons math)

我自己也曾考虑过直接从Java(例如JNI)利用MKL,但由于我是Java新手(更不用说在Java和本机库之间进行互操作了),找到一个已经正确、高效地实现了这一点并经过验证的Java库似乎更明智


如果我弄错了或被误导了(即使是关于我提到的任何库),以及我对Java产品的无知,我再次表示歉意。对于我来说,这是一个全新的世界,来自高度商业化的Microsoft堆栈,因此我很容易在哪里查找以及我提到的Java库方面出错。我将非常感谢任何帮助或建议。

我想你最好避免使用它们。我可能错了,这一点我都不太熟悉,所以除非其他人同意我的观点,否则不要从中吸取太多,但是调用JNI的开销相当大,因为它必须超出JRE和所有要做的事情,所以除非你将很多事情组合到一个单一的函数中,以便立即完成,调用外部库的成本将大大超过外部库的微小好处。我会放弃寻找MKL库,而是找到一个优化的纯Java库。不过,很抱歉,我知道还有比推荐的标准版本更好的版本。

对于FFT(数组上的批量操作)之类的东西,java中的范围检查可能会降低性能(至少最近是这样)。您可能想寻找优化其索引边界可证明性的库

根据

Java编程语言 规范要求数组边界 要与每个人一起执行的检查 阵列访问。索引边界检查 可以在编译时消除 可以证明用于 数组访问在一定范围内


实际上,我会研究JNI,并在那里进行批量操作,如果它们单独非常大的话。操作所需时间越长(即求解大型线性系统或大型FFT),使用JNI的价值就越高(即使您必须在那里和后面进行memcpy)

就个人而言,我同意你的一般做法,将重量级数学从Java转移到商业级的库中

在谷歌上搜索Java/MKL集成,这样您的建议在技术上是可行的。另一个选择是。我一直使用MKL,虽然我用Fortran编程,所以没有集成问题。我当然可以推荐他们的质量和性能。例如,我们测试了FFTW的MKL版本和我们自己从源代码构建的版本。MKL实现速度快了一个小整数倍

如果您担心通过JNI调用库的性能,那么您应该计划对应用程序进行结构化,以减少较大的调用,而不是进行较小的调用。至于使用JNI的困难,我的观点(我已经做了一些JNI编程)是,您在学习如何使用接口方面所做的初步努力将得到很好的回报


我注意到,对于可以使用哪些Java数学库的建议,您似乎还没有不知所措。和你一样,我也会对网络上搜罗的研究质量高、使用率低的Java库表示怀疑

MKL提供的大多数操作都算作“将许多事情组合在一起”,我真的很想听听金融和科学行业的Java开发人员在做什么。