【问题标题】:jblas blas lapack - dsysv slower than dgesv - Why solveSymmetric is slower than solvejblas blas lapack - dsysv 比 dgesv 慢 - 为什么solveSymmetric 比solve 慢
【发布时间】:2021-01-20 08:49:27
【问题描述】:

我有一个制作线性代数的 Java 程序。我使用 jblas 库,据我了解,它应该调用实现 Blas 和 Lapack 的本地库以获得更快的结果。

此代码在 Docker 中运行并在 AWS Batch 托管作业中启动。

摘自 Dockerfile:

FROM debian:stretch
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install libgfortran3 # install fortran
RUN apt-get -y install openjdk-8-jdk # install java 8

我尝试提高对 24000 x 24000 方对称矩阵求逆的速度。 我看到 jblas 库提供了 2 种方法。一种用于使用原生 dgesv 过程进行通用线性系统求解,另一种用于使用原生 dsysv 过程进行对称矩阵求解.

DoubleMatrix A = ...; // my 24k symmetric square matrix
DoubleMatrix B = DoubleMatrix.eye(A.rows);// Identity matrix
DoubleMatrix C = Solve.solve(A, B);// takes 4020 s
DoubleMatrix D = Solve.solveSymmetric(A, B);// takes 5040 s, longer than the calculation of C

问题 1:当使用原生 Blas 和 Lapack 库时,求解 24k 方阵需要这么多时间是否正常?如果不是,如何提高在 AWS Batch 作业的上下文中运行时的速度?

问题 2:为什么求解对称 (dsysv) 比一般求解 (dgesv) 慢?我的期望是,如果我们让原生库知道输入矩阵是对称的,它会给它一个提示,让它能够更快地求解线性系统。

顺便说一句,我检查了这 2 种方法是否给出了相同的数值结果。就是这样。

【问题讨论】:

    标签: java lapack blas aws-batch jblas


    【解决方案1】:

    我只会回答你的一个问题。

    • 求解一个 24k 方阵需要这么多时间是否正常。 答:是的,矩阵求逆是 O(n^3),所以你要做几十万亿次运算。你用矩阵求逆做什么?如果你只是想解决一个系统,那么最好使用类似于神经网络流行的梯度下降方法的迭代算法,例如Gauss-Seidel,或Richardson

    另一个问题很棘手,并非对称矩阵中的所有操作都比一般矩阵中的操作更有效。 为了论证的缘故,假设您想要一个以列为主的一维数组形式的通用矩阵中的单个元素。 A[i,j] = A_ge[j*N+i],但是在下三角部分A[i,j] = i > j ? A_sy[i*(i+1)/2 + j] : A_sy[j*(j+1)/2 + i] 的对称表示中,内存中的冗余使得检索所需元素变得更加简单。

    如果实施了最有效的算法,我认为答案应该是否定的。但使用对称矩阵表示的主要动机可能是节省内存或数值稳定性,而不是速度。

    这 20% 的运行时间增加可能是由于索引效率较低,例如,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2018-04-06
      • 2013-01-10
      • 1970-01-01
      • 2019-12-18
      • 2015-10-04
      • 2012-09-16
      相关资源
      最近更新 更多