サイズ 5000x5000 の大きな行列を 20000x20000 まで乗算する必要があります。スパース行列を持ちながら高速乗算を実行できるライブラリを見つけるのに問題があります。
まず、Java 行列ライブラリのパフォーマンスに関する以前の質問 ( Java 行列数学ライブラリのパフォーマンス? ) を読みました。そこでの上位の回答に基づいて、最速の 1 つである JBLAS を使用することにしました。私の場合、5000x5000 の行列を乗算するのに約 50 秒ほどかかりました。これは、Matlab よりもかなり遅いですが、それでも許容範囲です。
問題は、マトリックスが非常に大きくなる可能性があることです (最大 20k x 20k、またはそれ以上) が、通常は疎です。行列の要素の 30% だけが非ゼロです。JBLAS は疎行列の実装を提供しないため、大規模な密行列を格納するために必要なメモリ フットプリントは非常に大きくなる可能性があります。MTJ/Netlib は、疎行列を持つベンチマークで優れたライブラリの 1 つであるはずなので、MTJ/Netlib に切り替えてみました。ここのメモ ( https://github.com/fommil/netlib-java/ ) には、最高のパフォーマンスを得るには、自分のマシンでネイティブ BLAS をコンパイルする必要があると書かれています。そこで、OpenBLAS をダウンロードし、コンパイルしてインストールしました。また、いくつかのコマンドを実行して、Ubuntu 13.10 で OpenBLAS ライブラリを設定します。
$ cd ~/build/OpenBLAS
$ make
$ sudo make install PREFIX=/usr/local/openblas
$ sudo cat "/usr/local/openblas/lib" > /etc/ld.so.conf.d/openblas.conf
$ sudo ldconfig
$ sudo update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /usr/local/openblas/lib/libopenblas.so 90
$ sudo update-alternatives --config libblas.so.3
最後の update-alternatives ステップで、コンパイル済みの OpenBLAS ライブラリを選択しました。この後、Netlib がコンパイル済みの OpenBLAS ライブラリを取得して使用すると仮定します。また、 http: //r.research.att.com/benchmarks/R-benchmark-25.R からいくつかのベンチマークを実行し、前 (ubuntu のデフォルトの blas を使用) と後 (私の使用コンパイルされた OpenBLAS)。
ただし、MTJ での行列と行列の乗算のパフォーマンスは依然として非常に遅いです。たとえば、A = 5824x5824、W = 5824x4782 の 2 つの行列があります。Javaでこのように掛けます
Matrix AW = new FlexCompRowMatrix(A.numRows(), W.numColumns());
A.mult(W, AW);
コードは現在 45 分以上実行されており、この投稿全体を入力するのに十分ですが、まだ終了していません。JBLAS を使用すると、同じ行列の乗算に 1 分もかかりません。私が逃したものはありますか?
ありがとう !