我需要将大小为 5000x5000 的大矩阵乘以 20000x20000。我在查找具有稀疏矩阵但可以进行快速乘法的库时遇到问题。
首先,我已经阅读了上一个关于 Java 矩阵库性能的问题(Java 矩阵数学库的性能?)。基于那里的最佳答案,我决定使用 JBLAS,因为它是最快的之一。就我而言,乘以 5000x5000 矩阵大约需要 50 秒左右,这比 Matlab 慢很多,但仍然可以忍受。
问题是矩阵可能非常大(最多 20k x 20k 或更多),但它们通常很稀疏。矩阵中只有 30% 的元素是非零的。JBLAS 不提供任何稀疏矩阵实现,因此存储大型密集矩阵所需的内存占用可能会非常高。我尝试切换到 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
我在最后一个更新替代步骤中选择了我编译的 OpenBLAS 库。我假设在此之后,Netlib 拿起我编译的 OpenBLAS 库并使用它。我还从http://r.research.att.com/benchmarks/R-benchmark-25.R运行了一些基准测试,并观察到之前(使用来自 ubuntu 的默认 blas)和之后的情况(使用我的编译 OpenBLAS)。
但是,MTJ 中的矩阵-矩阵乘法性能仍然很慢。例如,我有两个矩阵 A = 5824x5824,W = 5824x4782。我在Java中像这样将它们相乘
Matrix AW = new FlexCompRowMatrix(A.numRows(), W.numColumns());
A.mult(W, AW);
代码已经运行了超过 45 分钟,足以输入整篇文章,但仍未完成。使用 JBLAS,相同的矩阵乘法只需不到 1 分钟。有什么我错过的吗?
谢谢 !