gpt4 book ai didi

java - 使用 MTJ/Netlib( native )的缓慢矩阵乘法性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:42 25 4
gpt4 key购买 nike

我需要将大小为 5000x5000 的大矩阵乘以 20000x20000。我在寻找具有稀疏矩阵但可以进行快速乘法的库时遇到问题。

首先,我阅读了上一个关于 Java 矩阵库性能的问题 (Performance of Java matrix math libraries?)。基于那里的最佳答案,我决定使用 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 分钟。有什么我错过的吗?

谢谢!

最佳答案

JBLAS 执行密集矩阵运算。 MJT 既有密集的也有稀疏的。以密集的方式使用“稀疏”矩阵很慢。 FlexCompRowMatrix 创建一个稀疏矩阵。

要直接与 JBLAS 进行比较,您要做的是:

Matrix a = new DenseMatrix(5000,5000);
Matrix b = new DenseMatrix(5000,5000);
Matrix c = new DenseMatrix(5000,5000);

a.multAdd(b, c);

使用MJT+OpenBlas的性能应该和MatLab差不多。

关于java - 使用 MTJ/Netlib( native )的缓慢矩阵乘法性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com