1. ホーム
  2. java

[解決済み] Java行列演算ライブラリの性能?[クローズド]

2022-04-28 20:55:12

質問

私たちは、実行時間が行列演算によって制限されるものを計算しています。 (興味があれば、以下にいくつかの詳細を示します。) この経験は次のような質問を促しました。

行列計算(乗算、逆行列など)のためのJavaライブラリの性能について、民間の経験はありますか? 例えば、以下のようなものです。

検索しても何も出てきません。


速度比較の詳細です。

Intel FORTRAN (ifort (IFORT) 10.1 20070913)を使用しています。 Apache commons math 1.2 matrix ops を使って Java (1.6) で再実装したところ、精度の桁数まですべて一致しました。 (私たちはJavaでそれをしたい理由があります。) (Java doubles, Fortran real*8)。 Fortranの場合。jvisualmのプロファイリングでは、RealMatrixImpl.{getEntry,isValidCoordinate}に多くの時間が費やされています(未発表のApache Commons math 2.0ではなくなっているようですが、2.0のほうが全然速いです)。 FortranはAtlas BLASルーチン(dpotrfなど)を使用しています。

もちろん、これは各言語のコードに依存する可能性がありますが、ほとんどの時間は等価な行列演算にあると信じています。

ライブラリを使わない他のいくつかの計算では、Javaはそれほど遅くなく、時にはずっと速いこともあります。

どのように解決するのか?

私の2セントを追加します。これらのライブラリをいくつか比較してみました。3000×3000の倍数の行列を自分自身と行列乗算しようとしました。結果は以下の通りです。

C/C++、Octave、Python、RでマルチスレッドのATLASを使用した場合、かかった時間は4秒程度でした。

JamaとJavaを使用した場合、所要時間は50秒でした。

ColtとParallel Colt with Javaを使用した場合、所要時間は150秒でした!

JBLASをJavaで使用した場合、JBLASはマルチスレッドのATLASを使用しているため、かかった時間は再び4秒程度となりました。

つまり、私にとっては、Javaのライブラリはあまり良いパフォーマンスを示さないことが明らかでした。しかし、もし誰かがJavaでコーディングしなければならないのであれば、JBLASが最適な選択肢となるでしょう。Jama、Colt、Parallel Coltは高速ではありません。