4

我查看了 StackOverflow 和 Google 上的相关线程,但运气不佳。我对 Java 也很陌生(我来自 C# 和 .NET 背景),所以请多多包涵。Java 世界中可用的东西太多了,令人难以抗拒。

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

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

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

我曾考虑尝试自己直接从 Java 中利用 MKL(例如 JNI),但我是 Java 新手(更不用说 Java 和本机库之间的互操作了),找到一个已经正确、有效地完成此任务的 Java 库似乎更聪明,并且是证明。

如果我犯了错误或被误导(即使是关于我提到的任何库)以及我对 Java 产品的无知,我再次道歉。对于来自高度商业化的 Microsoft 堆栈的我来说,这是一个全新的世界,因此我很容易在查看我提到的 Java 库的位置和问题上搞错。我将不胜感激任何帮助或建议。

4

3 回答 3

1

对于 FFT(数组上的批量操作)之类的事情,java 中的范围检查可能会影响您的性能(至少最近确实如此)。您可能想要寻找优化其索引范围可证明性的库。

根据热点规范

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

我实际上会查看 JNI,如果它们单独很大,则在那里进行批量操作。操作花费的时间越长(即求解大型线性系统或大型 FFT),使用 JNI 的价值就越大(即使您必须在那里和回来进行 memcpy)。

于 2010-06-12T02:36:18.770 回答
1

就个人而言,我同意你的一般方法,将重量级数学从 Java 卸载到商业级库。

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

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

我注意到您似乎还没有对可以使用哪些 Java 数学库的建议感到不知所措。像你一样,我会怀疑从网上拖出的研究质量、低使用率的 Java 库。

于 2010-06-12T08:32:02.737 回答
-1

我认为你最好避开它们。我可能是错的,这不是我太熟悉的一点,所以除非其他几个人同意我的观点,否则不要从中获得太多,但是调用 JNI 有相当大的开销,因为它必须到外面去JRE 和所有要做的事情,所以除非你将很多东西组合成一个函数来一次完成,否则调用它们的成本将大大超过外部库的微小好处。我会放弃寻找 MKL 库并找到优化的纯 Java 库。我不能说我知道比推荐的标准更好,抱歉。

于 2010-06-12T01:49:35.053 回答