1

我有一个制作线性代数的 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) 慢?我的期望是,如果我们让原生库知道输入矩阵是对称的,它会给它一个提示,让它能够更快地求解线性系统。

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

4

1 回答 1

1

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

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

另一个问题很棘手,并非对称矩阵中的所有操作都比一般矩阵中的操作更有效。为了论证的缘故,假设您想要一个以列为主的一维数组形式的通用矩阵中的单个元素。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% 的运行时间增加可能是由于索引效率较低,例如,

于 2021-02-20T23:39:26.777 回答