如何解决jblas blas lapack - dsysv 比 dgesv 慢 - 为什么solveSymmetric 比solve 慢
我有一个制作线性代数的 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 库提供了两种方法。一种用于使用原生 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) 慢?我的期望是,如果我们让原生库知道输入矩阵是对称的,它会给它一个提示,让它更快地解决线性系统。
顺便说一下,我检查了这两种方法给出了相同的数值结果。情况就是这样。
解决方法
我只会回答你的一个问题。
- 解决一个 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% 的运行时间增加可能是由于索引效率较低,例如,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。