Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MTJ/Netlib(本机)的缓慢矩阵乘法性能_Java_Performance_Math_Matrix_Mtj - Fatal编程技术网

Java 使用MTJ/Netlib(本机)的缓慢矩阵乘法性能

Java 使用MTJ/Netlib(本机)的缓慢矩阵乘法性能,java,performance,math,matrix,mtj,Java,Performance,Math,Matrix,Mtj,我需要将大小为5000x5000到20000x2000的大矩阵相乘。我在寻找一个有稀疏矩阵但可以快速乘法的库时遇到了一个问题 首先,我已经阅读了前面关于Java矩阵库()性能的问题。根据上面的答案,我决定选择JBLAS,因为它是最快的。在我的例子中,一个5000x5000矩阵相乘大约需要50秒左右的时间,这比Matlab慢很多,但仍然可以接受 问题是矩阵可能相当大(高达20k乘20k或更大),但它们通常是稀疏的。矩阵中只有30%的元素是非零的。JBLAS不提供任何稀疏矩阵实现,因此存储大型密集矩

我需要将大小为5000x5000到20000x2000的大矩阵相乘。我在寻找一个有稀疏矩阵但可以快速乘法的库时遇到了一个问题

首先,我已经阅读了前面关于Java矩阵库()性能的问题。根据上面的答案,我决定选择JBLAS,因为它是最快的。在我的例子中,一个5000x5000矩阵相乘大约需要50秒左右的时间,这比Matlab慢很多,但仍然可以接受

问题是矩阵可能相当大(高达20k乘20k或更大),但它们通常是稀疏的。矩阵中只有30%的元素是非零的。JBLAS不提供任何稀疏矩阵实现,因此存储大型密集矩阵所需的内存占用可能会非常高。我尝试切换到MTJ/Netlib,因为它应该是基准测试中具有稀疏矩阵的更好的库之一。这里的注释()说,为了获得最佳性能,我必须在我的机器上编译本机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库并使用它。我还从中运行了一些基准测试,并在before(使用ubuntu中的默认blas)和after(使用我编译的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大致相同。

请参见 请注意,您可能需要更新本机软件包 测试中的名称以演示使用

例如,可能需要更改: 类javaBlasClass=Class.forName(“org.netlib.blas.JBLAS”); 致:
类javaBlasClass=com.github.fommil.netlib.BLAS.Class

我还尝试了预编译的多线程OpenBLAS库(),认为我在编译过程中搞砸了。但是没有什么变化,使用MTJ/Netlib的矩阵乘法仍然很慢。也许问题是,为什么JBLAS可以做到如此(相对)快,即使我根本不需要配置任何东西?我可以问一下乘以20000x2000矩阵的目的是什么吗?就我所知,我还没有看到任何应用程序。好吧,20k乘20k是相当长的一段时间。不过,我认为一个5k乘5k的矩阵是相当合理的,而且它会永远运行…@MartijnCourteaux,有成千上万的问题需要将矩阵相乘,相乘的矩阵要比20k元素大得多。从PDE溶液到化学反应建模,再到DNA测序。更不用说基本的矩阵分解了。这不仅是一个常见的问题,而且在许多应用中都非常重要。BLAS规范通常只定义密集和非常特殊的带状矩阵的格式和操作。您应该使用稀疏矩阵库。-通常,可以使用(近似、迭代)算法,仅使用矩阵向量积来解决涉及稀疏矩阵的任务。只有在MATLAB使用相同的blas/lapack时,才能与MATLAB相比;-)顺便说一句,为什么这个没有标记为答案?@jwd请将这个标记为答案,它是正确的。库@fommil的作者已经说过,请标记正确。