Java的MKL加速数学库

4
我在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中利用MKL(例如JNI),但是我对Java(更不用说在Java和本地库之间进行交互)非常陌生,因此找到一个已经正确、高效并经过验证的Java库似乎更明智。
再次道歉,如果我误解或误导了(甚至是关于我提到的任何库),以及我对Java提供的东西的无知。对我来说,从商业化程度很高的Microsoft堆栈转变到全新的世界,所以我可能会在寻找和涉及我提到的Java库方面犯错。我非常感谢任何帮助或建议。

1
我非常好奇金融和科学行业的Java开发人员正在做什么。 - Kaopua
3个回答

1

对于像FFT(数组上的批量操作)这样的事情,Java中的范围检查可能会降低您的性能(至少最近是这样)。 您可能需要寻找优化其索引边界可证明性的库。

根据HotSpot规范

Java编程语言规范要求每次访问数组时执行数组边界检查。当编译器可以证明用于数组访问的索引在边界内时,可以消除索引边界检查。

如果它们单独非常大,则实际上应该看JNI,并在那里执行批量操作。 操作所需时间越长(即解决大型线性系统或大型FFT),使用JNI就越值得(即使您必须进行memcpy来回传输数据)。


1

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

在谷歌上搜索 Java/MKL 集成,我找到了这个,所以你提出的方案在技术上是可行的。考虑另一个选择,那就是NAG 库。我经常使用 MKL,虽然我用 Fortran 编程,所以没有集成问题。我肯定可以推荐它们的质量和性能。例如,我们测试了 FFTW 的 MKL 版本和我们自己构建的版本进行比较。MKL 实现是更快的,速度快了好几倍。

如果你担心通过 JNI 调用库的性能问题,那么你应该计划构建你的应用程序,使其少进行大量调用,而不是进行更多的小调用。至于使用 JNI 的困难,我的观点(我已经做过一些 JNI 编程)是,你必须付出一开始学习如何使用接口的努力,但会得到很好的回报。

我注意到你似乎还没有被推荐使用哪些Java数学库所压倒。像你一样,我也会对从网络上搜索到的研究质量低、使用率低的Java库持怀疑态度。


-1

我认为你最好避免使用它们。我可能错了,因为这不是我太熟悉的领域,所以除非其他人也同意我的看法,否则不要过多参考我的意见。调用JNI会产生相当大的开销,因为它必须跳出JRE并执行所有操作,所以除非你将许多东西组合成一个函数一次性处理,否则外部库的轻微优势将被调用它们的巨大成本所抵消。我建议你放弃寻找MKL库,而是找一个经过优化的纯Java库。但很抱歉,我不知道有什么比标准库更好的推荐。


3
MKL提供的大多数操作都可以被视为“将许多东西分组在一起”的操作。 - Pete Kirkham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接