4

私は StackOverflow と Google で関連するスレッドを調べましたが、あまり運がありませんでした。私はJavaも初めてです(C#と.NETのバックグラウンドから来ました)ので、ご容赦ください。Java の世界には非常に多くの情報があり、圧倒されます。

私は、重くて非常に反復的な数値計算 (つまり、統計、FFT、線形代数、行列など) を必要とする新しい Java-on-Linux プロジェクトを開始しています。そのため、数学演算のパフォーマンスを最大化することが要件であり、数学が正しいことを保証することも必要です。そのため、おそらく MKL などのネイティブ アクセラレーションを活用し、実証済みの Java ライブラリを見つけることに興味があります (したがって、ここでは商用オプションが確実に可能です)。

.NET スペースには、Centerspace NMath や Extreme Optimization など、高度に最適化され、MKL で高速化された商用数学ライブラリがあります。Javaに匹敵するものはありますか?

私が見つけた Java 用の数学ライブラリのほとんどは、積極的に維持されていないように見えるか (Colt など)、MKL やその他のネイティブ アクセラレーション (Apache Commons Math など) を活用していないようです。

私は Java から直接 MKL を活用することを検討しました (JNI など) が、私は Java に不慣れなので (Java とネイティブ ライブラリ間の相互運用は言うまでもなく)、これを既に正しく効率的に実行している Java ライブラリを見つける方が賢明に思えました。証明された。

繰り返しになりますが、私が間違っていたり見当違いであったり (私が言及したライブラリに関しても)、Java の提供について無知であったりした場合は、お詫び申し上げます。非常に商業化された Microsoft スタックから来た私にとってはまったく新しい世界なので、どこを見ればいいのか、また言及した Java ライブラリに関して簡単に誤解される可能性があります。助けやアドバイスをいただければ幸いです。

4

3 に答える 3

1

FFT (配列に対する一括操作) などの場合、Java の範囲チェックによってパフォーマンスが低下する可能性があります (少なくとも最近はそうでした)。おそらく、インデックス境界の証明可能性を最適化するライブラリを探したいと思うでしょう。

The HotSpot 仕様によると

Java プログラミング言語仕様では、配列アクセスごとに配列境界チェックを実行する必要があります。配列アクセスに使用されるインデックスが境界内にあることをコンパイラが証明できる場合は、インデックス境界チェックを省略できます。

私は実際に JNI を見て、個別に非常に大きい場合はそこで一括操作を行います。操作に時間がかかるほど (つまり、大規模な線形システムや大規模な FFT を解く場合)、JNI を使用する価値が高くなります (memcpy で行ったり来たりする必要がある場合でも)。

于 2010-06-12T02:36:18.770 に答える
1

個人的には、重い数学をJavaから商用グレードのライブラリにオフロードするというあなたの一般的なアプローチに同意します。

Java / MKLの統合についてグーグルで調べてみると、あなたが提案していることは技術的に可能であることがわかりました。考慮すべきもう 1 つのオプションは、NAG ライブラリです。私は常に MKL を使用していますが、Fortran でプログラミングしているため、統合の問題はありません。私は確かにそれらの品質とパフォーマンスをお勧めできます. たとえば、FFTW の MKL バージョンを、独自のソースから構築したバージョンに対してテストしました。MKL の実装は、小さな整数倍だけ高速でした。

JNI を介してライブラリを呼び出すパフォーマンスに懸念がある場合は、より小さな呼び出しよりも大きな呼び出しを少なくするようにアプリケーションを構成することを計画する必要があります。JNI を使用することの難しさについては、私の意見 (JNI プログラミングをいくつか行ったことがあります) は、インターフェースの使用方法を習得するために必要な最初の努力は十分に報われるというものです。

使用できる Java 数学ライブラリーの提案にまだ圧倒されていないようです。あなたと同じように、私はネットからトロールされた研究品質で使用率の低い Java ライブラリを疑っています。

于 2010-06-12T08:32:02.737 に答える
-1

そちらは避けた方が無難かと思います。私は間違っているかもしれませんが、私はあまり詳しくないので、他の何人かが私に同意しない限り、あまり多くを取りすぎないでください。 JRE とそれを実行するためのすべての機能を備えているため、多くのものを 1 つの関数にグループ化して一度に処理しない限り、外部ライブラリのわずかな利点よりも、それらを呼び出すコストの方がはるかに大きくなります。MKL ライブラリーを探すのをあきらめて、最適化された純粋な Java ライブラリーを見つけます。推奨する標準のものよりも優れているとは言えませんが、申し訳ありません。

于 2010-06-12T01:49:35.053 に答える